set_time_limit(0); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); 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); if (get_my_block_id($db) > get_block_id($db)) { die('get_my_block_id > get_block_id'); } $currency_list = get_currency_list($db); // нужно знать текущий блок, который есть у большинства нодов $block_id = get_confirmed_block_id($db); // сколько должно быть подтверждений, т.е. кол-во блоков сверху $confirmations = 5; // берем всех юзеров по порядку $community = get_community_users($db); for ($k = 0; $k < sizeof($community); $k++) { $private_key = ''; $MY_PREFIX = $community[$k] . '_'; //print $MY_PREFIX."\n"; $table_exists = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSHOW TABLES LIKE '" . DB_PREFIX . "{$MY_PREFIX}my_keys'\n\t\t\t", 'num_rows'); if (!$table_exists) { continue; } // проверим, майнер ли $miner_id = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `miner_id`\n\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\tWHERE `user_id` = {$community[$k]}\n\t\tLIMIT 1\n\t\t", 'fetch_one'); if ($miner_id) { // наш приватный ключ нода, которым будем расшифровывать комменты $private_key = get_node_private_key($db, $MY_PREFIX); } // возможно, что комменты будут зашифрованы юзерским ключем
} debug_print('Закончили спать, теперь генерим блок', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $block_id = $testBlock->prev_block['block_id']; if (!$block_id) { debug_print("continue", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); main_unlock(); unset($testBlock); sleep(1); continue; } $my_user_id = $testBlock->user_id; $new_block_id = $block_id + 1; $new_block_id_binary = dec_binary($new_block_id, 4); $user_id_binary = dec_binary($testBlock->cur_user_id, 5); $level_binary = dec_binary($testBlock->level, 1); if (get_community_users($db)) { $my_prefix = $testBlock->user_id . '_'; } else { $my_prefix = ''; } $node_private_key = get_node_private_key($db, $my_prefix); $prev_head_hash = $testBlock->prev_block['head_hash']; ##################################### ## Формируем блок ##################################### print '$new_block_id=' . $new_block_id . "\n"; print '$cur_user_id=' . $testBlock->cur_user_id . "\n"; if (!$testBlock->cur_user_id) { debug_print("continue", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); main_unlock(); unset($testBlock);
die("!defined('DC')"); } $variables = ParseData::get_all_variables($db); if (empty($_SESSION['restricted'])) { $tpl['public_key'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `public_key`\n\t\t\tFROM `" . DB_PREFIX . MY_PREFIX . "my_keys`\n\t\t\tWHERE `block_id` = (SELECT max(`block_id`) FROM `" . DB_PREFIX . MY_PREFIX . "my_keys` )\n\t\t\t", 'fetch_one'); $tpl['public_key'] = bin2hex($tpl['public_key']); } $tpl['my_notice'] = get_my_notice_data(); $tpl['script_version'] = str_ireplace('[ver]', get_current_version($db), $lng['script_version']); $script_name = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `script_name`\n\t\tFROM `" . DB_PREFIX . "main_lock`\n\t\t", 'fetch_one'); if ($script_name == 'my_lock') { $tpl['demons_status'] = 'OFF'; } else { $tpl['demons_status'] = 'ON'; } if (isset($db) && get_community_users($db)) { $pool_admin_user_id = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `pool_admin_user_id`\n\t\t\t\tFROM `" . DB_PREFIX . "config`\n\t\t\t\t", 'fetch_one'); if ((int) $_SESSION['user_id'] === (int) $pool_admin_user_id) { define('POOL_ADMIN', true); } } // несколько краудфандинговых проектов $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `" . DB_PREFIX . "cf_projects`.*\n\t\tFROM `" . DB_PREFIX . "cf_projects`\n\t\tLEFT JOIN `" . DB_PREFIX . "cf_projects_data` ON `" . DB_PREFIX . "cf_projects_data`.`project_id` = `" . DB_PREFIX . "cf_projects`.`id`\n\t\tWHERE `del_block_id` = 0 AND\n\t\t\t\t\t `end_time` > " . time() . " AND\n\t\t\t\t\t `lang_id` = {$lang}\n\t\tORDER BY `funders` DESC\n\t\tLIMIT 3\n\t\t"); while ($row = $db->fetchArray($res)) { $row = array_merge(project_data($row), $row); $tpl['projects'][$row['id']] = $row; } // история операций по кошелькам if (empty($_SESSION['restricted'])) { // получаем последние транзакции по кошелькам $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT *\n\t\t\t\tFROM `" . DB_PREFIX . MY_PREFIX . "my_dc_transactions`\n\t\t\t\tWHERE `status` = 'approved'\n\t\t\t\tORDER BY `id` DESC\n\t\t\t\tLIMIT 0, 10\n\t\t\t\t");
$db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); while (true) { // отметимся в БД, что мы живы. upd_deamon_time($db); // проверим, не нужно нам выйти, т.к. обновилась версия скрипта if (check_deamon_restart($db)) { exit; } $my_config = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `out_connections`,\n\t\t\t\t\t\t `local_gate_ip`\n\t\t\tFROM `" . DB_PREFIX . "config`\n\t\t\t", 'fetch_array'); if ($my_config['local_gate_ip']) { sleep(5); continue; } // ровно стольким нодам мы будем слать хэши блоков и тр-ий $max_hosts = $my_config['out_connections'] ? $my_config['out_connections'] : 10; $collective = get_community_users($db); if (!$collective) { // сингл-мод $collective[0] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `user_id`\n\t\t\t\tFROM `" . DB_PREFIX . "my_table`\n\t\t\t\t", 'fetch_one'); } // в сингл-моде будет только $my_miners_ids[0] $my_miners_ids = get_my_miners_ids($db, $collective); $nodes_ban = array(); $hosts = array(); $urls = array(); $del_miners = array(); $nodes_inc = ''; $nodes_count = 0; // забаненные хосты $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `host`, `ban_start`\n\t\t\t\tFROM `" . DB_PREFIX . "nodes_ban`\n\t\t\t\tLEFT JOIN `" . DB_PREFIX . "miners_data` ON `" . DB_PREFIX . "miners_data`.`user_id` = `" . DB_PREFIX . "nodes_ban`.`user_id`\n\t\t\t\t"); while ($row = $db->fetchArray($res)) {
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); // валюты $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `id`, `name` FROM `' . DB_PREFIX . 'currency` ORDER BY `name` '); while ($row = $db->fetchArray($res)) { $currency_list[$row['id']] = $row['name']; } $notifications_array = array(); $user_email_sms_data = array(); $my_users_ids = get_community_users($db); if (!$my_users_ids) { $community = false; // сингл-мод $my_users_ids[0] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `user_id`\n\t\t\tFROM `" . DB_PREFIX . "my_table`\n\t\t\t", 'fetch_one'); } else { $community = true; } if (get_my_block_id($db) > get_block_id($db)) { exit; } if ($my_users_ids) { for ($i = 0; $i < sizeof($my_users_ids); $i++) { if ($community) { $my_prefix = $my_users_ids[$i] . '_'; } else {
function decrypt_data(&$binary_tx, $db, &$decrypted_key = '') { if (!$binary_tx) { return '[error]!$binary_tx'; } // вначале пишется user_id, чтобы в режиме пула можно было понять $my_user_id = ParseData::binary_dec_string_shift($binary_tx, 5); debug_print('$my_user_id=' . $my_user_id, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // изымем зашифрванный ключ, а всё, что останется в $binary_tx - сами зашифрованные хэши тр-ий/блоков $encrypted_key = ParseData::string_shift($binary_tx, ParseData::decode_length($binary_tx)); debug_print('$encrypted_key=' . $encrypted_key, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if (!$encrypted_key) { return '[error]!$encrypted_key'; } $my_user_id = intval($my_user_id); $collective = get_community_users($db); if ($collective) { if (!in_array($my_user_id, $collective)) { return '[error] bad user_id'; } $my_prefix = $my_user_id . '_'; } else { $my_prefix = ''; } debug_print('$my_prefix=' . $my_prefix, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $private_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` = (SELECT max(`block_id`) FROM `" . DB_PREFIX . "{$my_prefix}my_node_keys`)\n\t\t\t\t", 'fetch_one'); //debug_print('$private_key='.$private_key, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if (!$private_key) { return '[error]!$my_private_key'; } $rsa = new Crypt_RSA(); $rsa->loadKey($private_key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $decrypted_key = $rsa->decrypt($encrypted_key); debug_print('$decrypted_key=' . $decrypted_key, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if (!$decrypted_key) { return '[error]!$decrypted_key'; } $aes = new Crypt_AES(); $aes->setKey($decrypted_key); // теперь в $binary_tx будет обычная тр-ия $binary_tx = $aes->decrypt($binary_tx); debug_print('$binary_data=' . $binary_tx, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$binary_data(hex)=' . bin2hex($binary_tx), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); return $binary_tx; }
function mydctx_rollback() { // если работаем в режиме пула $community = get_community_users($this->db); if ($community) { for ($i = 0; $i < sizeof($community); $i++) { $my_prefix = $community[$i] . '_'; // может захватиться несколько транзакций, но это не страшно, т.к. всё равно надо откатывать $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tDELETE FROM `" . DB_PREFIX . "{$my_prefix}my_dc_transactions`\n\t\t\t\t\t\tWHERE `block_id` = {$this->block_data['block_id']}\n\t\t\t\t\t\t"); $AffectedRows = $this->db->getAffectedRows(); $this->rollbackAI("{$my_prefix}my_dc_transactions", $AffectedRows); } } else { // может захватиться несколько транзакций, но это не страшно, т.к. всё равно надо откатывать $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tDELETE FROM `" . DB_PREFIX . "my_dc_transactions`\n\t\t\t\t\tWHERE `block_id` = {$this->block_data['block_id']}\n\t\t\t\t\t"); $AffectedRows = $this->db->getAffectedRows(); $this->rollbackAI("my_dc_transactions", $AffectedRows); } }