<?php if (!defined('DC')) { die("!defined('DC')"); } $tpl['data']['type'] = 'change_geolocation'; $tpl['data']['type_id'] = ParseData::findType($tpl['data']['type']); $tpl['data']['time'] = time(); $tpl['data']['user_id'] = $user_id; // уведомления $tpl['alert'] = @$_REQUEST['parameters']['alert']; if (empty($_SESSION['restricted'])) { $tpl['geolocation'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `geolocation` FROM `' . DB_PREFIX . MY_PREFIX . 'my_table` ', 'fetch_one'); } if (!$tpl['geolocation']) { $tpl['geolocation'] = '39.94887, -75.15005'; } $x = explode(', ', $tpl['geolocation']); $tpl['geolocation_lat'] = $x[0]; $tpl['geolocation_lon'] = $x[1]; $tpl['country'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `country`\n\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\tWHERE `user_id` = {$user_id}\n\t\t", 'fetch_one'); $tpl['countries'] = $countries; $tpl['variables'] = ParseData::get_variables($db, array('limit_change_geolocation', 'limit_change_geolocation_period')); $tpl['limits_text'] = str_ireplace(array('[limit]', '[period]'), array($tpl['variables']['limit_change_geolocation'], $tpl['periods'][$tpl['variables']['limit_change_geolocation_period']]), $lng['geolocation_limits_text']); require_once ABSPATH . 'templates/geolocation.tpl';
print '0'; } print "</td>"; //print "<td><div style=\"width: 300px; height: 40px; overflow: auto; background-color: #f2dede\">{$block_data['sign']}</div></td>"; print "</tr>"; } print '</table>'; } else { if ($block_id) { print '<table class="table">'; $row = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `data`,\n\t\t\t\t\t\t `hash`\n\t\t\tFROM `" . DB_PREFIX . "block_chain`\n\t\t\tWHERE `id` = {$block_id}\n\t\t\tLIMIT 1\n\t\t\t", 'fetch_array'); $bin_to_hex_array = array('sign', 'public_key', 'encrypted_message', 'comment', 'bin_public_keys'); //$hash = substr(bin2hex($row['hash']), 0, 8); $hash = bin2hex($row['hash']); $binary_data = $row['data']; $parsedata = new ParseData($binary_data, $db); $parsedata->ParseData_tmp(); $block_data = $parsedata->block_data; $tx_array = $parsedata->tx_array; $block_data['sign'] = bin2hex($block_data['sign']); print "<tr><td><strong>Block_id</strong></strong></td><td>{$block_data['block_id']}</td></tr>"; print "<tr><td><strong>Hash</strong></td><td>{$hash}</td></tr>"; print "<tr><td><strong>Time</strong></td><td>" . date('d-m-Y H:i:s', $block_data['time']) . " / {$block_data['time']}</td></tr>"; print "<tr><td><strong>User_id</strong></td><td>{$block_data['user_id']}</td></tr>"; print "<tr><td><strong>Level</strong></td><td>{$block_data['level']}</td></tr>"; print "<tr><td><strong>Sign</strong></td><td>" . chunk_split($block_data['sign'], 130) . "</td></tr>"; if ($tx_array) { //print sizeof($tx_array); print "<tr><td><strong>Transactions</strong></td><td><div><pre>"; for ($i = 0; $i < sizeof($tx_array); $i++) { foreach ($tx_array[$i] as $k => $v) {
// хосты могут еще не успеть набраться 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(); // //возьмем хэш текущего блока и номер блока // //для теста ролбеков отключим на время $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `block_id`,\n\t\t\t\t\t\t\t `hash`,\n\t\t\t\t\t\t\t `head_hash`\n\t\t\t\tFROM `" . DB_PREFIX . "info_block`\n\t\t\t\tWHERE `sent` = 0\n\t\t\t\t", 'fetch_array'); debug_print($data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); //$data = ''; // //для тестов
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . urlencode($encrypted_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $encrypted_tx_set = curl_exec($ch); curl_close($ch); debug_print('$encrypted_tx_set=' . $encrypted_tx_set, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$my_key=' . $my_key, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $aes = new Crypt_AES(); $aes->setKey($my_key); // теперь в $binary_tx будут обычные тр-ии $binary_tx = $aes->decrypt($encrypted_tx_set); unset($aes); debug_print('$binary_tx=' . $binary_tx, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // разберем полученные тр-ии do { $tx_size = ParseData::decode_length($binary_tx); $tx_binary_data = ParseData::string_shift($binary_tx, $tx_size); debug_print('$tx_binary_data=' . $tx_binary_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); list(, $tx_hex) = unpack("H*", $tx_binary_data); if (!$tx_binary_data) { continue; } // проверим размер if (strlen($tx_binary_data) > $variables['max_tx_size']) { debug_print('strlen($binary_tx) > $variables[max_tx_size]', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); die("error tx size"); } // точно ли выдали то /*if ( md5($tx_binary_data) != $new_data['tx_hash'] ) { debug_print("error tx_hash (".md5($tx_binary_data)."!={$new_data['tx_hash']})", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); die ("error tx_hash (".md5($tx_binary_data)."!={$new_data['tx_hash']})"); }*/
require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; require_once ABSPATH . 'includes/errors.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); $encrypted_data = $_REQUEST['data']; //debug_print("encrypted_data={$encrypted_data}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $binary_tx_hashes = decrypt_data($encrypted_data, $db, $decrypted_key); if (substr($binary_tx_hashes, 0, 7) == '[error]') { die($binary_tx_hashes); } //debug_print("binary_tx_hashes={$binary_tx_hashes}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $binary_tx = ''; // Разбираем список транзакций do { list(, $tx_hash) = unpack("H*", string_shift($binary_tx_hashes, 16)); if (!$tx_hash) { continue; } $tx = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `data`\n\t\t\tFROM `" . DB_PREFIX . "transactions`\n\t\t\tWHERE `hash` = 0x{$tx_hash}\n\t\t\t", 'fetch_one'); if ($tx) { $binary_tx .= ParseData::encode_length_plus_data($tx); } } while ($binary_tx_hashes); // шифруем тр-ии $aes = new Crypt_AES(); $aes->setKey($decrypted_key); $encrypted_data = $aes->encrypt($binary_tx); unset($aes); //debug_print("decrypted_key={$decrypted_key}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); //debug_print("encrypted_data={$encrypted_data}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); print $encrypted_data;
//require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); $user_id = intval($_REQUEST['user_id']); if (!check_input_data($user_id, 'int')) { die('error user_id'); } $lang = get_lang(); require_once ABSPATH . 'lang/' . $lang . '.php'; $sec = 3600 * 24 * 365; $prognosis = array(); $counters_ids = array(); $miners_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT *\n\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\tWHERE `user_id` = {$user_id}\n\t\tLIMIT 1\n\t\t", 'fetch_array'); // получим ID майнеров, у которых лежат фото нужного нам юзера $miners_ids = ParseData::get_miners_keepers($miners_data['photo_block_id'], $miners_data['photo_max_miner_id'], $miners_data['miners_keepers'], true); $hosts = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `host`\n\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\tWHERE `miner_id` IN (" . implode(',', $miners_ids) . ")\n\t\t", 'array'); $currency_list = get_currency_list($db); /* * Обещанные * */ get_promised_amounts($user_id); if (!empty($tpl['promised_amount_list_gen'][72])) { $data = $tpl['promised_amount_list_gen'][72]; } else { if (!empty($tpl['promised_amount_list_gen'][72])) { $data = $tpl['promised_amount_list_gen'][72]; } else { if (!empty($tpl['promised_amount_list_gen'][23])) { $data = $tpl['promised_amount_list_gen'][23]; } else {
<?php if (!defined('DC')) { die("!defined('DC')"); } // уведомления $tpl['alert'] = @$_REQUEST['parameters']['alert']; $tpl['currency_list'] = get_currency_list($db); $tpl['currency_id'] = intval(@$_REQUEST['parameters']['currency_id']); if (!$tpl['currency_id']) { $tpl['currency_id'] = 150; } if (empty($_SESSION['restricted'])) { // то, что еще не попало в блоки. $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT * FROM `' . DB_PREFIX . MY_PREFIX . 'my_promised_amount` '); while ($row = $db->fetchArray($res)) { $tpl['promised_amount_list']['my_pending'][] = $row; } } $tpl['variables'] = ParseData::get_all_variables($db); get_promised_amounts($user_id); $tpl['limits_text'] = str_ireplace(array('[limit]', '[period]'), array($tpl['variables']['limit_promised_amount'], $tpl['periods'][$tpl['variables']['limit_promised_amount_period']]), $lng['limits_text']); $tpl['last_tx'] = get_last_tx($user_id, types_to_ids(array('new_promised_amount', 'change_promised_amount', 'del_promised_amount', 'for_repaid_fix', 'actualization_promised_amounts', 'mining'))); if (!empty($tpl['last_tx'])) { $tpl['last_tx_formatted'] = make_last_txs($tpl['last_tx']); } require_once ABSPATH . 'templates/promised_amount_list.tpl';
$db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tUPDATE `" . DB_PREFIX . "my_table`\n\t\t\t\t\t\tSET `user_id`={$user_id},\n\t\t\t\t\t\t\t `status` = 'user'\n\t\t\t\t\t\t"); } else { $error = 1; } } else { $error = 1; } } else { $ini_array = parse_ini_file(ABSPATH . "config.ini", true); if ($ini_array['main']['sign_hash'] == 'ip') { $hash = md5($_SERVER['REMOTE_ADDR']); } else { $hash = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']); } $for_sign = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `data`\n\t\t\t\t\tFROM `" . DB_PREFIX . "authorization`\n\t\t\t\t\tWHERE `hash` = 0x{$hash}\n\t\t\t\t\t", 'fetch_one'); $error = ParseData::checkSign($public_key, $for_sign, $sign, true); } if ($error) { $result = 0; } else { session_start(); define('MY_PREFIX', ''); $my_user_id = get_my_user_id($db); unset($_SESSION['restricted']); // убираем ограниченный режим $_SESSION['user_id'] = $my_user_id; if (!$_SESSION['user_id']) { $_SESSION['user_id'] = 'wait'; } else { $_SESSION['public_key'] = get_user_public_key2($my_user_id); }
//debug_print($db->printsql(), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $LOG_MARKER = "Вилка на {$block_id}. Откатываем по фронту все свежие тр-ии. [{$current_block_id}]"; // откатываем по фронту все свежие тр-ии $parsedata = new ParseData($transactions, $db); $parsedata->ParseDataRollbackFront(); unset($parsedata); } $LOG_MARKER = "Вилка на {$block_id}"; rollback_transactions_testblock($db, true); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tTRUNCATE TABLE `" . DB_PREFIX . "testblock`\n\t\t\t\t\t"); } //print '$binary_block_full='.$binary_block_full."\n"; // теперь у нас в таблицах всё тоже самое, что у нода, у которого качаем блок // и можем этот блок проверить и занести в нашу БД $LOG_MARKER = "new block_id = " . $block_id; $parsedata = new ParseData($binary_block_full, $db); $error = $parsedata->ParseDataFull(); debug_print("parsedata->block_data " . print_r_hex($parsedata->block_data), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if (!$error) { $parsedata->insert_into_blockchain(); } unset($parsedata); //main_unlock(); // начинаем всё с начала уже с другими нодами. Но у нас уже могут быть новые блоки до $block_id, взятые от нода, которого с в итоге мы баним if ($error) { //$block_id--; nodes_ban($db, $max_block_id_user_id, '$block_id=' . $block_id . "\n" . $error . "\n" . __FILE__ . ', ' . __LINE__ . ', ' . __FUNCTION__ . ', ' . __CLASS__ . ', ' . __METHOD__); debug_print("[[error]] ## пробуем взять этот же блок у другого нода ParseDataFull error={$error}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); //ob_save(); main_unlock(); sleep(1);
TYPE (0-блок, 1-тр-я) 1 BLOCK_ID 4 TIME 4 USER_ID 5 LEVEL 1 SIGN от 128 до 512 байт. Подпись от TYPE, BLOCK_ID, PREV_BLOCK_HASH, TIME, USER_ID, LEVEL, MRKL_ROOT Далее - тело блока (Тр-ии) */ //$merkle_root = $testBlock->merkle_tree_root($merkle_array); //$merkle_root_binary = pack( "H*", $merkle_root); $new_block_id_binary = dec_binary($new_testblock['block_id'], 4); //$prev_block_hash_binary = $testBlock->block_info['hash']; $time_binary = dec_binary($new_testblock['time'], 4); $user_id_binary = dec_binary($new_testblock['user_id'], 5); $level_binary = dec_binary($testBlock->level, 1); $new_block_header = dec_binary(0, 1) . $new_block_id_binary . $time_binary . $user_id_binary . $level_binary . ParseData::encode_length_plus_data($new_testblock['signature']); $new_block = $new_block_header . $transactions; list(, $new_block_hex) = unpack("H*", $new_block); //testblock_lock(); // и передаем блок для обратотки через скрипт queue_parser_testblock.php // т.к. есть запросы к log_time_, а их можно выполнять только по очереди $file = save_tmp_644('FQT', "{$new_header_hash}\t{$new_block_hex}"); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tLOAD DATA LOCAL INFILE '{$file}'\n\t\t\t\t\tREPLACE INTO TABLE `" . DB_PREFIX . "queue_testblock`\n\t\t\t\t\tFIELDS TERMINATED BY '\t'\n\t\t\t\t\t(@head_hash, @data)\n\t\t\t\t\tSET `head_hash` = UNHEX(@head_hash),\n\t\t\t\t\t\t `data` = UNHEX(@data)\n\t\t\t\t\t"); unlink($file); //debug_print($db->printsql()."\nAffectedRows=".$db->getAffectedRows() , __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); //main_unlock(); } else { //testblock_lock(); // если всё нормально, то пишем в таблу testblock новые данные $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tUPDATE `" . DB_PREFIX . "testblock`\n\t\t\tSET\n\t\t\t\t\t`time` = {$new_testblock['time']},\n\t\t\t\t\t`user_id` = {$new_testblock['user_id']},\n\t\t\t\t\t`header_hash`= 0x{$new_header_hash},\n\t\t\t\t\t`signature` = 0x{$new_testblock['signature_hex']}\n\t\t\t\t"); //debug_print($db->printsql()."\nAffectedRows=".$db->getAffectedRows() , __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
$for_user_id = $_REQUEST['for_user_id']; $new_public_key = hextobin($_REQUEST['new_public_key']); $data = dec_binary($type, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($user_id) . ParseData::encode_length_plus_data($for_user_id) . ParseData::encode_length_plus_data($new_public_key) . $bin_signatures; break; case 'change_arbitrator_list': $data = dec_binary($type, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($user_id) . ParseData::encode_length_plus_data($_REQUEST['arbitration_trust_list']) . $bin_signatures; break; case 'money_back_request': $data = dec_binary($type, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($user_id) . ParseData::encode_length_plus_data($_REQUEST['order_id']) . ParseData::encode_length_plus_data(hextobin($_REQUEST['arbitrator_enc_text'][0])) . ParseData::encode_length_plus_data(hextobin($_REQUEST['arbitrator_enc_text'][1])) . ParseData::encode_length_plus_data(hextobin($_REQUEST['arbitrator_enc_text'][2])) . ParseData::encode_length_plus_data(hextobin($_REQUEST['arbitrator_enc_text'][3])) . ParseData::encode_length_plus_data(hextobin($_REQUEST['arbitrator_enc_text'][4])) . ParseData::encode_length_plus_data(hextobin($_REQUEST['seller_enc_text'])) . $bin_signatures; break; case 'change_seller_hold_back': $data = dec_binary($type, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($user_id) . ParseData::encode_length_plus_data($_REQUEST['arbitration_days_refund']) . ParseData::encode_length_plus_data($_REQUEST['hold_back_pct']) . $bin_signatures; break; case 'money_back': $data = dec_binary($type, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($user_id) . ParseData::encode_length_plus_data($_REQUEST['order_id']) . ParseData::encode_length_plus_data($_REQUEST['amount']) . $bin_signatures; break; case 'change_arbitrator_conditions': $data = dec_binary($type, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($user_id) . ParseData::encode_length_plus_data($_REQUEST['conditions']) . ParseData::encode_length_plus_data($_REQUEST['url']) . $bin_signatures; break; case 'change_money_back_time': $data = dec_binary($type, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($user_id) . ParseData::encode_length_plus_data($_REQUEST['order_id']) . ParseData::encode_length_plus_data($_REQUEST['days']) . $bin_signatures; break; } $hash = md5($data); if (!in_array($_REQUEST['type'], array('new_pct', 'new_max_promised_amounts', 'new_reduction', 'votes_node_new_miner', 'new_max_other_currencies'))) { $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tINSERT INTO `" . DB_PREFIX . "transactions_status` (\n\t\t\t\t`hash`,\n\t\t\t\t`time`,\n\t\t\t\t`type`,\n\t\t\t\t`user_id`\n\t\t\t)\n\t\t\tVALUES (\n\t\t\t\t0x{$hash},\n\t\t\t\t" . time() . ",\n\t\t\t\t{$type},\n\t\t\t\t{$user_id}\n\t\t\t)"); } $data = bin2hex($data); $file = save_tmp_644('FSQ', "{$hash}\t{$data}"); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tLOAD DATA LOCAL INFILE '{$file}' IGNORE INTO TABLE `" . DB_PREFIX . "queue_tx`\n\t\tFIELDS TERMINATED BY '\t'\n\t\t(@hash, @data)\n\t\tSET `data` = UNHEX(@data),\n\t\t\t `hash` = UNHEX(@hash)\n\t\t"); unlink($file);
function types_to_ids($array) { $new = array(); for ($i = 0; $i < sizeof($array); $i++) { $new[] = ParseData::findType($array[$i]); } return $new; }
} $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT * FROM `' . DB_PREFIX . 'currency` '); while ($row = $db->fetchArray($res)) { if (isset($my_commission[$row['id']])) { $tpl['commission'][$row['id']] = $my_commission[$row['id']]; } else { $tpl['commission'][$row['id']] = array(0.1, $tpl['currency_min'][$row['id']], 0); } } // для CF-проектов $tpl['currency_list'][1000] = 'Crowdfunding'; if (isset($my_commission[1000])) { $tpl['commission'][1000] = $my_commission[1000]; } else { $tpl['commission'][1000] = array(0.1, 0.01, 0); } $tpl['conditions'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `conditions`\n\t\tFROM `" . DB_PREFIX . "arbitrator_conditions`\n\t\tWHERE `user_id` = {$user_id}\n\t\tLIMIT 1\n\t\t", 'fetch_one'); $tpl['conditions'] = json_decode($tpl['conditions'], true); if (!$tpl['conditions']) { $tpl['conditions'][72] = array('0.01', '0', '0.01', '0', '0.1'); $tpl['conditions'][23] = array('0.01', '0', '0.01', '0', '0.1'); } $tpl['last_tx'] = get_last_tx($user_id, types_to_ids(array('change_arbitrator_conditions')), 3); if (!empty($tpl['last_tx'])) { $tpl['last_tx_formatted'] = make_last_txs($tpl['last_tx']); } $tpl['pending_tx'] = @$pending_tx[ParseData::findType('change_arbitrator_conditions')]; require_once ABSPATH . 'templates/change_arbitrator_conditions.tpl';
$db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); // чтобы этот скрипт вызывался раз в 5 минут upd_deamon_time($db); // пишем свежие блоки в резервный блокчейн $end_block_id = get_end_block_id(); $cur_block_id = get_block_id($db); print $end_block_id . ' / ' . $cur_block_id; if ($cur_block_id - 30 > $end_block_id) { $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `id`, `data` FROM `' . DB_PREFIX . 'block_chain` WHERE `id` > ' . $end_block_id . ' AND `id` <= ' . ($cur_block_id - 30) . ' ORDER BY `id` '); while ($row = $db->fetchArray($res)) { $data = dec_binary($row['id'], 5) . ParseData::encode_length_plus_data($row['data']); $size_and_data = dec_binary(strlen($data), 5) . $data; file_put_contents(ABSPATH . 'public/blockchain', $size_and_data . dec_binary(strlen($size_and_data), 5), FILE_APPEND | LOCK_EX); } } $auto_reload = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `auto_reload`\n\t\tFROM `" . DB_PREFIX . "config`\n\t\t", 'fetch_one'); if ($auto_reload < 60) { exit; } // если main_lock висит более x минут, значит был какой-то сбой $main_lock = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `lock_time`\n\t\tFROM `" . DB_PREFIX . "main_lock`\n\t\tWHERE `script_name` NOT IN ('my_lock', 'cleaning_db')\n\t\t", 'fetch_one'); if ($main_lock && time() - $auto_reload > $main_lock) { // на всякий случай пометим, что работаем $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tUPDATE `" . DB_PREFIX . "main_lock`\n\t\t\tSET `script_name` = 'cleaning_db'\n\t\t\t"); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tUPDATE `" . DB_PREFIX . "config`\n\t\t\tSET `pool_tech_works` = 1\n\t\t\t"); $tables_array = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSHOW TABLES\n\t\t\t", 'array');
define('ABSPATH', dirname(__FILE__) . '/'); set_time_limit(0); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; require_once ABSPATH . 'includes/errors.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\n\t\t\tFROM `" . DB_PREFIX . "testblock`\n\t\t\tLIMIT 1\n\t\t\t", 'fetch_array'); $response_binary_data = dec_binary($data['block_id'], 4) . dec_binary($data['time'], 4) . dec_binary($data['user_id'], 5) . encode_length(strlen($data['signature'])) . $data['signature']; // разбираем присланные данные $binary_data = $_POST['data']; $add_sql = ''; if ($binary_data) { $tr_array = array(); // получим хэши тр-ий, которые надо исключить do { list(, $tr) = unpack("H*", ParseData::string_shift($binary_data, 16)); // проверим if (!check_input_data($tr, 'md5')) { die('error md5 (' . $tr . ')'); } $add_sql .= $tr . ','; } while ($binary_data); $add_sql = substr($add_sql, 0, -1); $add_sql = "WHERE `id` NOT IN ({$add_sql})"; } // сами тр-ии $transactions = ''; $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `data`\n\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t{$add_sql}\n\t\t"); while ($row = $db->fetchArray($res)) { $length = encode_length(strlen($row['data'])); $transactions .= $length . $row['data'];
<?php if (!defined('DC')) { die("!defined('DC')"); } $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT *\n\t\tFROM `" . DB_PREFIX . "points_status`\n\t\tWHERE `user_id` = {$user_id}\n\t\tORDER BY `time_start` DESC\n\t\t"); while ($row = $db->fetchArray($res)) { $tpl['points_status'][] = $row; } $tpl['my_points'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `points`\n\t\tFROM `" . DB_PREFIX . "points`\n\t\tWHERE `user_id` = {$user_id}\n\t\t", 'fetch_one'); $tpl['my_points'] = intval($tpl['my_points']); $tpl['variables'] = ParseData::get_variables($db, array('points_factor', 'limit_votes_complex_period')); // среднее значение $tpl['mean'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT sum(`points`)/count(`points`)\n\t\tFROM `" . DB_PREFIX . "points`\n\t\tWHERE `points` > 0\n\t\t", 'fetch_one'); $tpl['mean'] = round($tpl['mean'] * $tpl['variables']['points_factor']); // есть ли тр-ия с голосованием votes_complex за послдение 4 недели $count = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT count(`user_id`)\n\t\tFROM `" . DB_PREFIX . "votes_miner_pct`\n\t\tWHERE `user_id` = {$user_id} AND\n\t\t\t\t\t `time` > " . (time() - $tpl['variables']['limit_votes_complex_period'] * 2) . "\n\t\tLIMIT 1\n\t\t", 'fetch_one'); if ($count > 0) { $tpl['votes_ok'] = 'YES'; } else { $tpl['votes_ok'] = 'NO'; } require_once ABSPATH . 'templates/points.tpl';
main_unlock(); exit; } debug_print($max_other_currencies_votes, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $total_count_currencies = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT count(`id`)\n\t\t\tFROM `" . DB_PREFIX . "currency`\n\t\t\t", 'fetch_one'); foreach ($max_other_currencies_votes as $currency_id => $count_and_votes) { $new_max_other_currencies[$currency_id] = get_max_vote($count_and_votes, 0, $total_count_currencies, 10); } if (get_community_users($db)) { $my_prefix = $testBlock->user_id . '_'; } else { $my_prefix = ''; } $node_private_key = get_node_private_key($db, $my_prefix); $json_data = json_encode($new_max_other_currencies); // подписываем нашим нод-ключем данные транзакции $data_for_sign = ParseData::findType('new_max_other_currencies') . ",{$time},{$my_user_id},{$json_data}"; $rsa = new Crypt_RSA(); $rsa->loadKey($node_private_key); $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); $signature = $rsa->sign($data_for_sign); debug_print('$data_for_sign=' . $data_for_sign . "\n", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // создаем тр-ию. пишем $block_id, на момент которого были актуальны голоса в табле 'pct' $data = dec_binary(ParseData::findType('new_max_other_currencies'), 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($my_user_id) . ParseData::encode_length_plus_data($json_data) . ParseData::encode_length_plus_data($signature); $hash = ParseData::dsha256($data); insert_tx($data, $db); $new_tx_data['data'] = $data; $new_tx_data['hash'] = hextobin(md5($data)); tx_parser($new_tx_data, true); } main_unlock();
$res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `id`, `name`, `full_name`, `max_other_currencies` FROM `' . DB_PREFIX . 'currency` ORDER BY `full_name` '); while ($row = $db->fetchArray($res)) { $tpl['currency_list'][$row['id']] = $row; $tpl['currency_list_name'][$row['id']] = $row['name']; } $tpl['payment_systems'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `id`, `name` FROM `' . DB_PREFIX . 'payment_systems` ORDER BY `name` ', 'list', array('id', 'name')); $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `currency_id`,\n\t\t\t\t\t `amount`\n\t\tFROM `" . DB_PREFIX . "max_promised_amounts`\n\t\tWHERE `block_id` = 1\n\t\t"); while ($row = $db->fetchArray($res)) { $tpl['max_promised_amounts'][$row['currency_id']] = $row['amount']; } $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `currency_id`,\n\t\t\t\t\t `amount`\n\t\tFROM `" . DB_PREFIX . "max_promised_amounts`\n\t\tWHERE `block_id` = (SELECT max(`block_id`) FROM `" . DB_PREFIX . "max_promised_amounts` ) OR `block_id` = 0\n\t\t"); while ($row = $db->fetchArray($res)) { $tpl['max_promised_amounts'][$row['currency_id']] = $row['amount']; } $tpl['variables'] = ParseData::get_variables($db, array('limit_promised_amount', 'limit_promised_amount_period')); $tpl['limits_text'] = str_ireplace(array('[limit]', '[period]'), array($tpl['variables']['limit_promised_amount'], $tpl['periods'][$tpl['variables']['limit_promised_amount_period']]), $lng['limits_text']); // валюта, которая выбрана с селект-боксе $tpl['currency_id'] = 72; require_once ABSPATH . 'templates/promised_amount_add.tpl';
<?php if (!defined('DC')) { die("!defined('DC')"); } $tpl['data']['type'] = 'abuses'; $tpl['data']['type_id'] = ParseData::findType($tpl['data']['type']); $tpl['data']['time'] = time(); $tpl['data']['user_id'] = $user_id; $tpl['variables'] = ParseData::get_variables($db, array('limit_abuses', 'limit_abuses_period')); $tpl['limits_text'] = str_ireplace(array('[limit]', '[period]'), array($tpl['variables']['limit_abuses'], $tpl['periods'][$tpl['variables']['limit_abuses_period']]), $lng['abuses_limits_text']); require_once ABSPATH . 'templates/abuse.tpl';
continue; } //print "id майнеров, которые на нашем уровне\n"; debug_print($nodes_ids, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $add_sql = ''; for ($i = 0; $i < sizeof($nodes_ids); $i++) { $add_sql .= "{$nodes_ids[$i]},"; } $add_sql = substr($add_sql, 0, strlen($add_sql) - 1); if (!$add_sql) { debug_print("continue", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); sleep(1); continue; } // получим хосты майнеров, которые на нашем уровне $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `host`\n\t\t\t\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\t\t\t\tWHERE `user_id` IN ({$add_sql})\n\t\t\t\t\t"); while ($row = $db->fetchArray($res)) { $urls[]['url'] = $row['host'] . 'gate_testblock.php'; } // шлем block_id, user_id, mrkl_root, signature $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `block_id`, `time`, `user_id`, `mrkl_root`, `signature`\n\t\t\tFROM `" . DB_PREFIX . "testblock`\n\t\t\tWHERE `status` = 'active'\n\t\t\t", 'fetch_array'); //print_r($data); //print_R($urls); if ($data) { $data_binary = dec_binary($data['block_id'], 4) . dec_binary($data['time'], 4) . dec_binary($data['user_id'], 5) . $data['mrkl_root'] . ParseData::encode_length_plus_data($data['signature']); m_curl($urls, $data_binary, '', 'data', 30); } //else debug_print("END", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); sleep(1); } while (true);
if (!$argv) { die('browser'); } define('DC', true); // **************************************************************************** // Чистим таблы // **************************************************************************** define('ABSPATH', dirname(dirname(__FILE__)) . '/'); set_time_limit(0); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; require_once ABSPATH . 'includes/errors.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); main_lock(); $variables = ParseData::get_all_variables($db); $current_block_id = get_block_id($db); if (!$current_block_id) { main_unlock(); exit; } // чистим log_transactions каждые 15 минут. Удаляем данные, которые старше 36 часов. // Можно удалять и те, что старше rollback_blocks_2 + погрешность для времени транзакции (5-15 мин), // но пусть будет 36 ч. - с хорошим запасом. $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tDELETE FROM `" . DB_PREFIX . "log_transactions`\n\t\tWHERE `time` < " . (time() - 86400 * 3) . "\n\t\t"); // через rollback_blocks_2 с запасом 1440 блоков чистим таблу log_votes где есть del_block_id // при этом, если проверяющих будет мало, то табла может захламиться незаконченными голосованиями $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tDELETE FROM `" . DB_PREFIX . "log_votes`\n\t\tWHERE `del_block_id` < " . ($current_block_id - $variables['rollback_blocks_2'] - 1440) . " AND\n\t\t\t\t\t `del_block_id` > 0\n\t\t"); // через 1440 блоков чистим таблу wallets_buffer где есть del_block_id $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tDELETE FROM `" . DB_PREFIX . "wallets_buffer`\n\t\tWHERE `del_block_id` < " . ($current_block_id - $variables['rollback_blocks_2'] - 1440) . " AND\n\t\t\t\t\t `del_block_id` > 0\n\t\t"); // чистим все _log_time_
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__);
<?php if (!defined('DC')) { die("!defined('DC')"); } $tpl['data']['credit_part_type'] = 'money_back_request'; $tpl['data']['credit_part_type_id'] = ParseData::findType($tpl['data']['credit_part_type']); $tpl['data']['time'] = time(); $tpl['data']['user_id'] = $user_id; $tpl['my_orders'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT *\n\t\tFROM `" . DB_PREFIX . "orders`\n\t\tWHERE `buyer` = {$user_id}\n\t\tORDER BY `time` DESC\n\t\tLIMIT 20\n\t\t", 'all_data'); $tpl['currency_list'] = get_currency_list($db); $tpl['last_tx'] = get_last_tx($user_id, types_to_ids(array('change_seller_hold_back', 'money_back')), 3); if (!empty($tpl['last_tx'])) { $tpl['last_tx_formatted'] = make_last_txs($tpl['last_tx']); } require_once ABSPATH . 'templates/arbitration_buyer.tpl';
if (!defined('DC')) { die("!defined('DC')"); } $tpl['data']['type'] = 'change_seller_hold_back'; $tpl['data']['type_id'] = ParseData::findType($tpl['data']['type']); $tpl['data']['time'] = time(); $tpl['data']['user_id'] = $user_id; $tpl['hold_back'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `arbitration_days_refund`,\n\t\t\t\t\t `seller_hold_back_pct`\n\t\tFROM `" . DB_PREFIX . "users`\n\t\tWHERE `user_id` = {$user_id}\n\t\t", 'fetch_array'); $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT *\n\t\tFROM `" . DB_PREFIX . "orders`\n\t\tWHERE `seller` = {$user_id}\n\t\tORDER BY `time` DESC\n\t\tLIMIT 20\n\t\t"); while ($row = $db->fetchArray($res)) { if ($row['status'] == 'refund') { if (empty($_SESSION['restricted'])) { $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `comment`,\n\t\t\t\t\t\t\t\t `comment_status`\n\t\t\t\t\tFROM `" . DB_PREFIX . MY_PREFIX . "my_comments`\n\t\t\t\t\tWHERE `id` = {$row['id']} AND\n\t\t\t\t\t\t\t\t `type` = 'seller'\n\t\t\t\t\tLIMIT 1\n\t\t\t\t\t", 'fetch_array'); $row['comment'] = $data['comment']; $row['comment_status'] = $data['comment_status']; } } $tpl['my_orders'][] = $row; } if (empty($_SESSION['restricted'])) { $tpl['shop_data'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `shop_secret_key`,\n\t\t\t\t\t `shop_callback_url`\n\t\tFROM `" . DB_PREFIX . MY_PREFIX . "my_table`\n\t\t", 'fetch_array'); } $tpl['currency_list'] = get_currency_list($db); $tpl['miner_id'] = (int) $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `miner_id`\n\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\tWHERE `user_id` = {$user_id}\n\t\tLIMIT 1\n\t\t", 'fetch_one'); $tpl['last_tx'] = get_last_tx($user_id, types_to_ids(array('change_seller_hold_back', 'money_back')), 3); if (!empty($tpl['last_tx'])) { $tpl['last_tx_formatted'] = make_last_txs($tpl['last_tx']); } $tpl['pending_tx'] = @$pending_tx[ParseData::findType('change_seller_hold_back')]; require_once ABSPATH . 'templates/arbitration_seller.tpl';
$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 "; }
main_lock(); $my_user_id = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\tFROM `" . DB_PREFIX . MY_PREFIX . "my_table`\n\t\t\t\t\t", 'fetch_one'); $node_private_key = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `private_key`\n\t\t\t\t\tFROM `" . DB_PREFIX . MY_PREFIX . "my_node_keys`\n\t\t\t\t\tWHERE `block_id` = (SELECT max(`block_id`) FROM `" . DB_PREFIX . MY_PREFIX . "my_node_keys` )\n\t\t\t\t\t", 'fetch_one'); if (!$my_user_id || !$node_private_key) { main_unlock(); exit; } require_once ABSPATH . 'phpseclib/Math/BigInteger.php'; require_once ABSPATH . 'phpseclib/Crypt/Random.php'; require_once ABSPATH . 'phpseclib/Crypt/Hash.php'; require_once ABSPATH . 'phpseclib/Crypt/RSA.php'; $rsa = new Crypt_RSA(); extract($rsa->createKey(1024)); $publickey = clear_public_key($publickey); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tINSERT INTO `" . DB_PREFIX . MY_PREFIX . "my_node_keys` (\n\t\t\t\t`public_key`,\n\t\t\t\t`private_key`\n\t\t\t)\n\t\t\tVALUES (\n\t\t\t\t0x{$publickey},\n\t\t\t\t'{$privatekey}'\n\t\t\t)"); $time = time(); // подписываем нашим нод-ключем данные транзакции $data_for_sign = ParseData::findType('change_node_key') . ",{$time},{$my_user_id},{$publickey}"; $rsa = new Crypt_RSA(); $rsa->loadKey($node_private_key); $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); $signature = $rsa->sign($data_for_sign); print '$node_private_key=' . $node_private_key . "\n"; print '$data_for_sign=' . $data_for_sign . "\n"; print 'strlen($signature)=' . strlen($signature) . "\n"; print 'strlen($publickey)=' . strlen($publickey) . "\n"; // создаем новую транзакцию $bin_public_key = hextobin($publickey); $data = dec_binary(ParseData::findType('change_node_key'), 1) . dec_binary($time, 4) . encode_length(strlen($my_user_id)) . $my_user_id . encode_length(strlen($bin_public_key)) . $bin_public_key . encode_length(strlen($signature)) . $signature; insert_tx($data, $db); main_unlock();
<?php if (!defined('DC')) { die("!defined('DC')"); } $tpl['data']['type'] = 'change_key_close'; $tpl['data']['type_id'] = ParseData::findType($tpl['data']['type']); $tpl['data']['time'] = time(); $tpl['data']['user_id'] = $user_id; require_once ABSPATH . 'templates/change_key_close.tpl';
<?php if (!defined('DC')) { die("!defined('DC')"); } $tpl['data']['type'] = 'change_host'; $tpl['data']['type_id'] = ParseData::findType($tpl['data']['type']); $tpl['data']['time'] = time(); $tpl['data']['user_id'] = $user_id; $tpl['variables'] = ParseData::get_variables($db, array('limit_change_host', 'limit_change_host_period')); if (empty($_SESSION['restricted'])) { $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `host`, `host_status` FROM `' . DB_PREFIX . MY_PREFIX . 'my_table` ', 'fetch_array'); } $status_array = array('my_pending' => $lng['local_pending'], 'approved' => $lng['status_approved']); $tpl['host'] = $data['host']; $tpl['host_status'] = $status_array[$data['host_status']]; $tpl['limits_text'] = str_ireplace(array('[limit]', '[period]'), array($tpl['variables']['limit_change_host'], $tpl['periods'][$tpl['variables']['limit_change_host_period']]), $lng['change_host_limits_text']); require_once ABSPATH . 'templates/change_host.tpl';
SIGN от 128 байта до 512 байт. Подпись от TYPE, BLOCK_ID, PREV_BLOCK_HASH, TIME, USER_ID, LEVEL, MRKL_ROOT Далее - тело блока (Тр-ии) */ // подписываем нашим нод-ключем заголовок блока $rsa = new Crypt_RSA(); $rsa->loadKey($node_private_key); $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); //$rsa->setHash('sha256'); $for_sign = "0,{$new_block_id},{$testBlock->prev_block['hash']},{$time},{$my_user_id},{$testBlock->level},{$mrkl_root}"; debug_print('$for_sign=' . $for_sign, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $signature = $rsa->sign($for_sign); unset($rsa); list(, $signature_hex) = unpack("H*", $signature); debug_print('$signature_hex = ' . $signature_hex, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // хэш шапки блока. нужен для сравнивания с другими и у кого будет меньше - у того блок круче $header_hash = ParseData::dsha256("{$my_user_id},{$new_block_id},{$prev_head_hash}"); debug_print("header_hash={$header_hash}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $data = "{$new_block_id}\t{$time}\t{$testBlock->level}\t{$my_user_id}\t{$header_hash}\t{$signature_hex}\t{$mrkl_root}"; debug_print($data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $file = save_tmp_644('FTB', $data); // для тестов получим что там есть $tmp_testblock_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\n\t\t\tFROM `" . DB_PREFIX . "testblock`\n\t\t\t", 'fetch_array'); debug_print($tmp_testblock_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print("LOAD DATA LOCAL INFILE '{$file}' REPLACE INTO TABLE `" . DB_PREFIX . "testblock`", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // т.к. эти данные создали мы сами, то пишем их сразу в таблицу проверенных данных, которые будут отправлены другим нодам $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tLOAD DATA LOCAL INFILE '{$file}' REPLACE INTO TABLE `" . DB_PREFIX . "testblock`\n\t\t\tFIELDS TERMINATED BY '\t'\n\t\t\t(`block_id`,`time`,`level`,`user_id`, @header_hash, @signature, @mrkl_root)\n\t\t\tSET `header_hash` = UNHEX(@header_hash),\n\t\t\t\t `signature` = UNHEX(@signature),\n\t\t\t\t `mrkl_root` = UNHEX(@mrkl_root)\n\t\t\t"); unlink($file); // иногда не вставлялось, т.к. уже что-то было в testblock . добавил REPLACE debug_print('AffectedRows=' . $db->getAffectedRows(), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); /// ####################################### // Отмечаем транзакции, которые попали в transactions_testblock
debug_print('VOTE = NO', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } // проходимся по всем нашим майнерам, если это пул и по одному, если это сингл-мод foreach ($intersect_my_miners as $my_miner_id) { $my_user_id = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\t\t\t\t\tWHERE `miner_id` = {$my_miner_id}\n\t\t\t\t\t\t", 'fetch_one'); $community = get_community_users($db); if ($community) { $my_prefix = $my_user_id . '_'; } else { $my_prefix = ''; } $node_private_key = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT `private_key`\n\t\t\t\t\t\tFROM `" . DB_PREFIX . "{$my_prefix}my_node_keys`\n\t\t\t\t\t\tWHERE `block_id` = (SELECT max(`block_id`) FROM `" . DB_PREFIX . "{$my_prefix}my_node_keys` )\n\t\t\t\t\t\t", 'fetch_one'); $time = time(); // подписываем нашим нод-ключем данные транзакции $data_for_sign = ParseData::findType('votes_node_new_miner') . ",{$time},{$my_user_id},{$row['vote_id']},{$vote}"; $rsa = new Crypt_RSA(); $rsa->loadKey($node_private_key); $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); $signature = $rsa->sign($data_for_sign); debug_print('$data_for_sign=' . $data_for_sign, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // создаем новую транзакцию - подверждение, что фото скопировано и проверено. $data = dec_binary(30, 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($my_user_id) . ParseData::encode_length_plus_data($row['vote_id']) . ParseData::encode_length_plus_data($vote) . ParseData::encode_length_plus_data($signature); insert_tx($data, $db); } } // отмечаем, чтобы больше не брать эту строку $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tUPDATE `" . DB_PREFIX . "votes_miners`\n\t\t\t\tSET `cron_checked_time` = " . time() . "\n\t\t\t\tWHERE `id` = {$row['vote_id']}\n\t\t\t\t"); } main_unlock(); sleep(1); } while (true);