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();
Esempio n. 2
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);
$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;
Esempio n. 3
0
        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);
    debug_print($max_promised_amount_votes, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    $new_max_promised_amounts = array();
    foreach ($max_promised_amount_votes as $currency_id => $amounts_and_votes) {
        //$valid_amounts_and_votes = ParseData::makeMaxPromisedAmount($amounts_and_votes);
        //$key = get_max_vote($valid_amounts_and_votes, 0, 1000, 100);
        //$new_max_promised_amounts[$currency_id] =  ParseData::getPctValue($key);
        $new_max_promised_amounts[$currency_id] = get_max_vote($amounts_and_votes, 0, 165, 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_promised_amounts);
    // подписываем нашим нод-ключем данные транзакции
    $data_for_sign = ParseData::findType('new_max_promised_amounts') . ",{$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_promised_amounts'), 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();
Esempio n. 5
0
        $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);
Esempio n. 6
0
     $result = get_old_blocks($block_data['user_id'], $block_id - 1, $max_block_id_host, $max_block_id_user_id, $get_block_script_name, $add_node_host);
     debug_print($result, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
     //main_lock();
     if ($result) {
         nodes_ban($db, $max_block_id_user_id, 'block_id=' . $block_id . "\n" . $result . "\n" . __FILE__ . ', ' . __LINE__ . ', ' . __FUNCTION__ . ', ' . __CLASS__ . ', ' . __METHOD__);
         main_unlock();
         continue 2;
     }
 } else {
     debug_print("===========Вилка найдена=============\nСошлись на блоке {$block_id}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
     //main_lock();
     // получим наши транзакции в 1 бинарнике, просто для удобства
     $transactions = '';
     $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `data`\n\t\t\t\t\tFROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\tWHERE `verified` = 1 AND\n\t\t\t\t\t\t\t\t `used` = 0\n\t\t\t\t\t");
     while ($row = $db->fetchArray($res)) {
         $transactions .= ParseData::encode_length_plus_data($row['data']);
     }
     if ($transactions) {
         // отмечаем, что эти тр-ии теперь нужно проверять по новой
         $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tUPDATE `" . DB_PREFIX . "transactions`\n\t\t\t\t\tSET  `verified` = 0\n\t\t\t\t\tWHERE `verified` = 1 AND\n\t\t\t\t\t\t\t\t `used` = 0\n\t\t\t\t");
         //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");
 }
Esempio n. 7
0
function clear_incompatible_tx($binary_tx, $db, $my_tx)
{
    $LOG_MARKER = md5($binary_tx);
    $fatal_error = '';
    $wait_error = '';
    $to_user_id = '';
    // получим тип тр-ии и юзера
    list($type, $user_id, $third_var) = get_tx_type_and_user_id($binary_tx);
    if (!check_input_data($type, 'int')) {
        $fatal_error = 'error type';
    }
    if (!check_input_data($user_id, 'int')) {
        $fatal_error = 'error user_id';
    }
    if (!check_input_data($third_var, 'int')) {
        $fatal_error = 'error $third_var';
    }
    if ($type == ParseData::findType('cash_request_out')) {
        $to_user_id = $third_var;
    }
    if ($type == ParseData::findType('new_pct') || $type == ParseData::findType('new_reduction') || $type == ParseData::findType('new_max_promised_amounts') || $type == ParseData::findType('new_max_other_currencies')) {
        //  чтобы никому не слать эту тр-ю
        $for_self_use = 1;
        // $my_tx == true - это значит функция вызвана из pct_generator.php/reduction_generator.php
        // если же false, то она была спаршена query_tx или tesblock_generator и имела verified=0
        // а т.к. new_pct/new_reduction актуальны только 1 блок, то нужно её удалять
        if (!$my_tx) {
            $fatal_error = 'old new_pct/new_reduction/new_max_promised_amounts/new_max_other_currencies';
            $return = array($fatal_error, $wait_error, $for_self_use, $type, $user_id, $to_user_id);
            debug_print($return, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            return $return;
        }
    } else {
        $for_self_use = 0;
    }
    // две тр-ии одного типа от одного юзера не должны попасть в один блок
    // исключение - перевод DC между юзерами
    if (!$fatal_error) {
        clear_incompatible_tx_sql($db, $type, $user_id, $wait_error);
        // если новая тр-ия - это запрос на удаление или изменение обещанной суммы, то нужно проверить
        // нет ли запросов на получение обещанных сумм к данному юзеру
        // а также, нужно проверить, нет ли от данного юзера тр-ии cash_request_in
        if ($type == ParseData::findType('del_promised_amount') || $type == ParseData::findType('change_promised_amount')) {
            debug_print('если новая тр-ия - это запрос на удаление банкноты, то нужно проверить, нет ли запросов на получение банкнот к данному юзеру, а также, нужно проверить, нет от данного юзера тр-ии cash_request_in', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t            FROM (\n\t\t\t\t            SELECT `user_id`\n\t\t\t\t            FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t            WHERE (\n\t\t\t\t                             `third_var` = {$user_id} AND\n\t\t\t\t\t                         `verified`=1 AND\n\t\t\t\t\t                         `used` = 0\n\t\t\t\t\t                      )\n\t\t\t\t                          OR (\n\t\t\t\t\t                          `type` = " . ParseData::findType('cash_request_in') . " AND\n\t\t\t\t\t                          `user_id` = {$user_id}\n\t\t\t\t                         )\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE (\n\t\t\t\t\t\t\t\t\t\t\t `third_var` = {$user_id}\n\t\t\t\t\t\t\t\t\t\t) OR (\n\t\t\t\t\t                         `type` = " . ParseData::findType('cash_request_in') . " AND\n\t\t\t\t\t                         `user_id` = {$user_id}\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
            debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            if ($num) {
                $fatal_error = "`third_var` = {$user_id}";
            }
        }
        // если новая тр-ия - это запрос на получение наличных, то нужно проверить
        // нет ли у получающего юзера запросов на удаление или изменение обещанных сумм
        if ($type == ParseData::findType('cash_request_out')) {
            debug_print('если новая тр-ия - это запрос на получение банкнот, то нужно проверить, нет ли у получающего юзера запросов на удаление банкнот', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            $tx_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT *\n\t\t\t            FROM (\n\t\t\t\t            SELECT `data`\n\t\t\t\t            FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t            WHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t                         `user_id` = {$to_user_id} AND\n\t\t\t\t                         `verified`=1 AND\n\t\t\t\t                         `used` = 0\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `data`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t\t\t\t\t\t\t `user_id` = {$to_user_id}\n\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
            debug_print('$tx_data =' . $tx_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            if ($tx_data) {
                // откатим фронтальные записи
                $parsedata = new ParseData(ParseData::encode_length_plus_data($tx_data), $db);
                $parsedata->ParseDataRollbackFront();
                unset($parsedata);
                // Удаляем именно уже записанную тр-ию. При этом новая (cash_request_out) тр-ия успешно обработается
                $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\t\tDELETE\n\t\t\t                FROM `" . DB_PREFIX . "transactions`\n\t\t\t                WHERE `hash` = 0x" . md5($tx_data) . "\n\t\t\t\t\t\t\t");
                /*
                				 * создает проблемы для tesblock_is_ready
                				 *
                				 * $db->query( __FILE__, __LINE__,  __FUNCTION__,  __CLASS__, __METHOD__, "
                							DELETE
                			                FROM `".DB_PREFIX."transactions_testblock`
                			                WHERE `hash` = 0x".md5($tx_data)."
                							");*/
            }
        }
        // если новая тр-ия - это запрос на получение банкнот, то нужно проверить
        // нет ли у отправителя запроса на отправку DC, т.к. после списания может не остаться средств
        if ($type == ParseData::findType('cash_request_out')) {
            clear_incompatible_tx_sql_set($db, array('send_dc', 'new_forex_order', 'cf_send_dc'), $user_id, $wait_error);
        }
        // и наоборот
        if (in_array($type, array(ParseData::findType('send_dc'), ParseData::findType('new_forex_order'), ParseData::findType('cf_send_dc')))) {
            clear_incompatible_tx_sql($db, 'cash_request_out', $user_id, $wait_error);
        }
        // на всякий случай не даем попасть в один блок holidays и тр-им, где holidays используются
        if ($type == ParseData::findType('new_holidays')) {
            clear_incompatible_tx_sql($db, 'mining', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('mining')) {
            clear_incompatible_tx_sql($db, 'new_holidays', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('new_holidays')) {
            clear_incompatible_tx_sql($db, 'cash_request_in', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('cash_request_in')) {
            clear_incompatible_tx_sql($db, 'new_holidays', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('cash_request_out')) {
            clear_incompatible_tx_sql($db, 'new_holidays', $to_user_id, $wait_error);
        }
        // не должно попадать в одни блок new_miner_update и new_miner
        if ($type == ParseData::findType('new_miner')) {
            clear_incompatible_tx_sql($db, 'new_miner_update', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('new_miner_update')) {
            clear_incompatible_tx_sql($db, 'new_miner', $user_id, $wait_error);
        }
        // не должно попадать в один блок смена нодовского ключа и тр-ии которые этим ключем подписываются
        if ($type == ParseData::findType('change_node_key') || $type == ParseData::findType('new_miner')) {
            clear_incompatible_tx_sql($db, 'new_miner_update', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('change_node_key') || $type == ParseData::findType('new_miner')) {
            clear_incompatible_tx_sql($db, 'new_pct', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('new_miner_update')) {
            clear_incompatible_tx_sql_set($db, array('change_node_key', 'new_miner'), $user_id, $wait_error);
        }
        if ($type == ParseData::findType('new_pct')) {
            clear_incompatible_tx_sql_set($db, array('change_node_key', 'new_miner'), $user_id, $wait_error);
        }
        if ($type == ParseData::findType('change_node_key') || $type == ParseData::findType('new_miner')) {
            clear_incompatible_tx_sql($db, 'new_reduction', $user_id, $wait_error);
        }
        // восстановление ключа
        if ($type == ParseData::findType('change_key_request')) {
            clear_incompatible_tx_sql_set($db, array('change_key_active'), $third_var, $wait_error);
        }
        if ($type == ParseData::findType('change_key_active')) {
            clear_incompatible_tx_sql_set($db, array('change_key_request'), 0, $wait_error, $user_id);
        }
        // нельзя удалить/изменить обещанную сумму и затем создать запрос на её майнинг
        if ($type == ParseData::findType('mining')) {
            clear_incompatible_tx_sql_set($db, array('del_promised_amount', 'change_promised_amount'), $user_id, $wait_error);
        }
        if (in_array($type, array(ParseData::findType('del_promised_amount'), ParseData::findType('change_promised_amount')))) {
            clear_incompatible_tx_sql($db, 'mining', $user_id, $wait_error);
        }
        // в 1 блоке только 1 майнинг от юзера
        if ($type == ParseData::findType('mining')) {
            clear_incompatible_tx_sql($db, 'mining', $user_id, $wait_error);
        }
        if ($type == ParseData::findType('mining')) {
            clear_incompatible_tx_sql($db, 'admin_ban_miners', 0, $wait_error);
        }
        if ($type == ParseData::findType('cash_request_out')) {
            clear_incompatible_tx_sql($db, 'admin_ban_miners', 0, $wait_error);
        }
        if ($type == ParseData::findType('new_promised_amount')) {
            clear_incompatible_tx_sql($db, 'admin_ban_miners', 0, $wait_error);
        }
        if ($type == ParseData::findType('admin_ban_miners')) {
            rollback_incompatible_tx(array('cash_request_out', 'change_host', 'new_promised_amount', 'change_node_key', 'new_pct', 'mining', 'votes_miner', 'votes_node_new_miner', 'votes_promised_amount', 'abuses', 'new_promised_amount', 'votes_complex'), 0, $wait_error);
        }
        if ($type == ParseData::findType('votes_miner')) {
            clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error);
        }
        if ($type == ParseData::findType('votes_complex')) {
            clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error);
        }
        if ($type == ParseData::findType('abuses')) {
            // admin_ban_miners преоритетнее, abuses надо вытеснять
            clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error);
        }
        // дополнить
        if ($type == ParseData::findType('votes_node_new_miner')) {
            clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error);
        }
        if ($type == ParseData::findType('votes_promised_amount')) {
            clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error);
        }
        // нельзя голосовать за обещанную сумму юзера $promised_amount_user_id, если он меняет свое местоположение, т.к. сменится статус
        if ($type == ParseData::findType('votes_promised_amount')) {
            $promised_amount_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 . "promised_amount`\n\t\t\t\t\tWHERE  `id` = {$third_var}\n\t\t\t\t\tLIMIT 1\n\t\t\t\t\t", 'fetch_one');
            if ($promised_amount_user_id) {
                clear_incompatible_tx_sql_set($db, array('change_geolocation'), $promised_amount_user_id, $wait_error);
            }
        }
        // нельзя менять местоположение, если кто-то отдал голос за мою обещанную сумму
        if ($type == ParseData::findType('change_geolocation')) {
            $promised_amount_ids = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `id`\n\t\t\t\t\tFROM `" . DB_PREFIX . "promised_amount`\n\t\t\t\t\tWHERE  `user_id` = {$user_id}\n\t\t\t\t\t", 'array');
            $promised_amount_ids = implode(',', $promised_amount_ids);
            if ($promised_amount_ids) {
                $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t\t\t    FROM (\n\t\t\t\t\t\t        SELECT `user_id`\n\t\t\t\t\t\t        FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t\t        WHERE  (\n\t\t\t\t\t\t                        `type` = " . ParseData::findType('votes_promised_amount') . " AND `third_var` IN ({$promised_amount_ids})\n\t\t\t\t\t\t                      ) AND\n\t\t\t\t\t\t                     `verified`=1 AND\n\t\t\t\t\t\t                     `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE  (\n\t\t\t\t\t\t                        `type` = " . ParseData::findType('votes_promised_amount') . " AND `third_var` IN ({$promised_amount_ids})\n\t\t\t\t\t\t                      )\n\t\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
                if ($num) {
                    $wait_error = 'votes_promised_amount change_geolocation';
                }
            }
        }
        // нельзя удалять CF-проект и в этом же блоке изменить его описание/профинансировать
        if ($type == ParseData::findType('del_cf_project')) {
            clear_incompatible_tx_sql_set($db, array('cf_comment', 'cf_send_dc', 'cf_project_change_category', 'cf_project_data'), 0, $wait_error, $third_var);
        }
        if (in_array($type, array(ParseData::findType('cf_comment'), ParseData::findType('cf_send_dc'), ParseData::findType('cf_project_change_category'), ParseData::findType('cf_project_data')))) {
            clear_incompatible_tx_sql_set($db, array('del_cf_project'), 0, $wait_error, $third_var);
        }
        // потом нужно сделать более тонко. но пока так. Если есть удаление проекта, тогда откатываем все тр-ии del_cf_funding
        if ($type == ParseData::findType('del_cf_project')) {
            rollback_incompatible_tx(array('del_cf_funding'));
        }
        // потом нужно сделать более тонко. но пока так. Если есть del_cf_funding, тогда откатываем все тр-ии удаления проектов
        if ($type == ParseData::findType('del_cf_funding')) {
            rollback_incompatible_tx(array('del_cf_project'));
        }
        // потом нужно сделать более тонко. но пока так. Если есть смена комиссии, то нельзя отправлять тр-ии, где указана комиссия
        if (in_array($type, array(ParseData::findType('cf_send_dc'), ParseData::findType('send_dc'), ParseData::findType('new_forex_order')))) {
            rollback_incompatible_tx(array('change_commission'));
        }
        if ($type == ParseData::findType('change_commission')) {
            clear_incompatible_tx_sql_set($db, array('cf_send_dc', 'send_dc', 'new_forex_order'), 0, $wait_error);
        }
        // Если есть смена коммиссий арбитров, то нельзя делать перевод монет, т.к. там может быть указана комиссия арбитра
        if (in_array($type, array(ParseData::findType('send_dc')))) {
            rollback_incompatible_tx(array('change_arbitrator_conditions'));
        }
        if ($type == ParseData::findType('change_arbitrator_conditions')) {
            clear_incompatible_tx_sql_set($db, array('send_dc'), 0, $wait_error);
        }
        // если идет смена списка арбитров, то у отправителя и у получателя может получиться нестыковка
        if (in_array($type, array(ParseData::findType('send_dc')))) {
            rollback_incompatible_tx(array('change_arbitrator_list'));
        }
        if ($type == ParseData::findType('change_arbitrator_list')) {
            clear_incompatible_tx_sql_set($db, array('send_dc'), 0, $wait_error);
        }
        // на всякий случай не даем попасть в один блок тр-ии отправки в CF-проект монет и другим тр-ям связанным с этим CF-проектом. Т.к. проект может завершиться и 2-я тр-я вызовет ошибку
        if ($type == ParseData::findType('cf_send_dc')) {
            clear_incompatible_tx_sql_set($db, array('cf_send_dc', 'cf_comment', 'del_cf_project', 'cf_project_change_category', 'cf_project_data'), 0, $wait_error, $third_var);
        }
        if (in_array($type, array(ParseData::findType('cf_send_dc'), ParseData::findType('cf_comment'), ParseData::findType('del_cf_project'), ParseData::findType('cf_project_change_category'), ParseData::findType('cf_project_data')))) {
            clear_incompatible_tx_sql_set($db, array('cf_send_dc'), 0, $wait_error, $third_var);
        }
        // нельзя удалять promised_amount и голосовать за него
        if ($type == ParseData::findType('del_promised_amount')) {
            clear_incompatible_tx_sql_set($db, array('votes_promised_amount'), 0, $wait_error, $third_var);
        }
        if ($type == ParseData::findType('votes_promised_amount')) {
            clear_incompatible_tx_sql_set($db, array('del_promised_amount'), 0, $wait_error, $third_var);
        }
        if ($type == ParseData::findType('new_max_promised_amounts')) {
            clear_incompatible_tx_sql_set($db, array('new_max_promised_amounts'), 0, $wait_error, $third_var);
        }
        if ($type == ParseData::findType('new_max_other_currencies')) {
            clear_incompatible_tx_sql_set($db, array('new_max_other_currencies'), 0, $wait_error, $third_var);
        }
        if ($type == ParseData::findType('new_pct')) {
            clear_incompatible_tx_sql_set($db, array('new_pct'), 0, $wait_error, $third_var);
        }
        if ($type == ParseData::findType('new_reductions')) {
            clear_incompatible_tx_sql_set($db, array('new_reductions'), 0, $wait_error, $third_var);
        }
        // в один блок должен попасть только один голос за один объект голосования. $third_var - объект голосования
        if (in_array($type, array(ParseData::findType('votes_promised_amount'), ParseData::findType('votes_miner'), ParseData::findType('votes_node_new_miner'), ParseData::findType('votes_complex')))) {
            $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t            FROM (\n\t\t\t\t\t            SELECT `user_id`\n\t\t\t\t\t            FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t            WHERE  `type` IN (" . ParseData::findType('votes_promised_amount') . ", " . ParseData::findType('votes_miner') . ", " . ParseData::findType('votes_node_new_miner') . ", " . ParseData::findType('votes_complex') . ") AND\n\t\t\t\t\t                          `third_var` = {$third_var} AND\n\t\t\t\t\t                          `verified`=1 AND\n\t\t\t\t\t                          `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE `type` IN (" . ParseData::findType('votes_promised_amount') . ", " . ParseData::findType('votes_miner') . ", " . ParseData::findType('votes_node_new_miner') . ", " . ParseData::findType('votes_complex') . ") AND\n\t\t\t\t\t                          `third_var` = {$third_var}\n\t\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
            debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            if ($num) {
                $wait_error = 'only 1 vote';
            }
        }
        // если новая тр-ия - это запрос, в котором юзер отдает наличные (cash_request_in)
        // то нужно проверить, не хочет ли юзер удалить или изменить одну из обещанных сумм
        if ($type == ParseData::findType('cash_request_in')) {
            debug_print('если новая тр-ия - это запрос, в котором юзер отдает банкноты (cash_request_in), то нужно проверить, не хочет ли юзер удалить одну из передаваемых банкнот', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            $tx_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT *\n\t\t\t            FROM (\n\t\t\t\t            SELECT `data`\n\t\t\t\t            FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t            WHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t                         `user_id` = {$user_id} AND\n\t\t\t\t                         `verified`=1 AND\n\t\t\t\t                         `used` = 0\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `data`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t\t\t\t\t\t\t `user_id` = {$user_id}\n\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
            debug_print('$tx_data =' . $tx_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            if ($tx_data) {
                // откатим фронтальные записи
                $parsedata = new ParseData(ParseData::encode_length_plus_data($tx_data), $db);
                $parsedata->ParseDataRollbackFront();
                unset($parsedata);
                // Удаляем именно уже записанную тр-ию. При этом новая (cash_request_in) тр-ия успешно обработается
                $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\t\tDELETE\n\t\t\t                FROM `" . DB_PREFIX . "transactions`\n\t\t\t                WHERE `hash` = 0x" . md5($tx_data) . "\n\t\t\t\t\t\t\t");
                /*
                 * создает проблемы для tesblock_is_ready
                 *
                $db->query( __FILE__, __LINE__,  __FUNCTION__,  __CLASS__, __METHOD__, "
                			DELETE
                			                FROM `".DB_PREFIX."transactions_testblock`
                			                WHERE `hash` = 0x".md5($tx_data)."
                			");
                */
            }
        }
        if ($type == ParseData::findType('change_primary_key')) {
            debug_print('если новая тр-я - это смена праймари ключа, то не должно быть никаких других тр-ий от этого юзера', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t            FROM (\n\t\t\t\t\t            SELECT `user_id`\n\t\t\t\t\t            FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t            WHERE  `user_id` = {$user_id} AND\n\t\t\t\t\t                         `verified`=1 AND\n\t\t\t\t\t                         `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE `user_id` = {$user_id}\n\t\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
            debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            if ($num) {
                $wait_error = 'there are other tr-s';
            }
        }
        if ($type == ParseData::findType('admin_change_primary_key')) {
            debug_print('если новая тр-я - это смена праймари ключа, то не должно быть никаких других тр-ий от юзера, которому меняем ключ', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t            FROM (\n\t\t\t\t\t            SELECT `user_id`\n\t\t\t\t\t            FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t            WHERE  `user_id` = {$third_var} AND\n\t\t\t\t\t                         `verified`=1 AND\n\t\t\t\t\t                         `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE `user_id` = {$third_var}\n\t\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
            debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
            if ($num) {
                $wait_error = 'there are other tr-s';
            }
        }
        // любая тр-я от юзера не должна проходить, если уже есть тр-я со сменой праймари ключа или new_pct или new_reduction
        $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t            FROM (\n\t\t\t\t\t            SELECT `user_id`\n\t\t\t\t\t            FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t            WHERE  (\n\t\t\t\t\t\t                            (`type` = " . ParseData::findType('change_primary_key') . " AND `user_id` = {$user_id})\n\t\t\t\t\t\t                            OR\n\t\t\t\t\t\t                            (type IN (" . ParseData::findType('new_pct') . ", " . ParseData::findType('new_reduction') . ") )\n\t\t\t\t\t                          ) AND\n\t\t\t\t\t                         `verified`=1 AND\n\t\t\t\t\t                         `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE  (\n\t\t\t\t\t\t                            (`type` = " . ParseData::findType('change_primary_key') . " AND `user_id` = {$user_id})\n\t\t\t\t\t\t                            OR\n\t\t\t\t\t\t                            (type IN (" . ParseData::findType('new_pct') . ", " . ParseData::findType('new_reduction') . ") )\n\t\t\t\t\t                          )\n\t\t\t\t\t\t\t)  AS `x`\n\t\t\t\t\t\t", 'fetch_one');
        debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
        if ($num) {
            $wait_error = 'have change_primary_key tx';
        }
        // если пришло new_pct, то нужно откатить следующие тр-ии
        if ($type == ParseData::findType('new_pct')) {
            rollback_incompatible_tx(array('new_reduction', 'change_node_key', 'new_miner', 'votes_promised_amount', 'send_dc', 'cash_request_in', 'mining', 'cf_send_dc', 'del_cf_project', 'new_forex_order', 'del_forex_order', 'for_repaid_fix', 'actualization_promised_amounts', 'del_cf_funding', 'admin_unban_miners', 'admin_ban_miners'));
        }
        // если пришло new_reduction, то нужно откатить следующие тр-ии
        if ($type == ParseData::findType('new_reduction')) {
            rollback_incompatible_tx(array('new_pct', 'change_node_key', 'new_miner', 'votes_promised_amount', 'send_dc', 'cash_request_in', 'mining', 'cf_send_dc', 'del_cf_project', 'new_forex_order', 'del_forex_order', 'for_repaid_fix', 'actualization_promised_amounts', 'del_cf_funding', 'admin_unban_miners', 'admin_ban_miners'));
        }
        // временно запрещаем 2 тр-ии любого типа от одного юзера, а то затрахался уже.
        $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT count(*)\n\t\t\t\t    FROM (\n\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t\t\tWHERE  `user_id` = {$user_id} AND\n\t\t\t\t                      `verified`=1 AND\n\t\t\t\t                      `used` = 0\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE `user_id` = {$user_id}\n\t\t\t\t\t)  AS `x`\n\t\t\t\t", 'fetch_one');
        debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
        if ($num) {
            $wait_error = 'only 1 tx';
        }
    }
    if ($fatal_error) {
        debug_print('fatal[error] ==' . $fatal_error, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    }
    if ($wait_error) {
        debug_print('wait[error] ==' . $wait_error, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    }
    $return = array($fatal_error, $wait_error, $for_self_use, $type, $user_id, $third_var);
    debug_print($return, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    return $return;
}
Esempio n. 8
0
    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__);
Esempio n. 9
0
 rollback_transactions_testblock($db);
 debug_print("ParseDataRollbackFront OK", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 //ob_save();
 // проверим блок, который получился с данными, которые прислал другой нод
 $parsedata = new ParseData($new_block, $db);
 $error = $parsedata->ParseData_gate();
 debug_print("ParseData_gate OK", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 if ($error) {
     unset($parsedata);
     debug_print('------------------[error]' . $error . '-------------------', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
     // т.к. мы откатили наши тр-ии из transactions_testblock, то теперь нужно обработать их по новой
     // получим наши транзакции в 1 бинарнике, просто для удобства
     $my_testblock['block_body'] = '';
     $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `data`\n\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\tORDER BY `id` ASC\n\t\t\t\t");
     while ($row = $db->fetchArray($res)) {
         $my_testblock['block_body'] .= ParseData::encode_length_plus_data($row['data']);
     }
     if ($my_testblock['block_body']) {
         $parsedata = new ParseData(dec_binary(0, 1) . $my_testblock['block_body'], $db);
         $parsedata->ParseData_gate(true);
         unset($parsedata);
     }
     /*if (substr_count($error, '[limit_requests]')>0) {
     			debug_print('----------------[error]'.$error.'-------------------', __FILE__, __LINE__,  __FUNCTION__,  __CLASS__, __METHOD__);
     			// если есть ошибки, то откатим фронтальные измненения от этого блока
     			$parsedata = new ParseData($tx, $db);
     			$parsedata->ParseDataRollbackFront();
     		}
     		else {
     			debug_print('error wo rollback----------------[error]'.$error.'-------------------', __FILE__, __LINE__,  __FUNCTION__,  __CLASS__, __METHOD__);
     		}*/
Esempio n. 10
0
$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');
Esempio n. 11
0
                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);
Esempio n. 12
0
    }
    if (!$new_admin) {
        main_unlock();
        exit;
    }
    $testBlock = new testblock($db, true);
    if (get_community_users($db)) {
        $my_prefix = $testBlock->user_id . '_';
    } else {
        $my_prefix = '';
    }
    $node_private_key = get_node_private_key($db, $my_prefix);
    // подписываем нашим нод-ключем данные транзакции
    $data_for_sign = ParseData::findType('new_admin') . ",{$time},{$my_user_id},{$new_admin}";
    $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_admin'), 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($my_user_id) . ParseData::encode_length_plus_data($new_admin) . ParseData::encode_length_plus_data($signature);
    $hash = ParseData::dsha256($data);
    insert_tx($data, $db);
    // и не закрывая main_lock переводим нашу тр-ию в verified=1, откатив все несовместимые тр-ии
    // таким образом у нас будут в блоке только актуальные голоса.
    // а если придет другой блок и станет verified=0, то эта тр-ия просто удалится.
    $new_tx_data['data'] = $data;
    $new_tx_data['hash'] = hextobin(md5($data));
    tx_parser($new_tx_data, true);
}
main_unlock();
Esempio n. 13
0
//print $reduction_pct."\n";
//print $reduction_type."\n";
//print $reduction_currency_id."\n";
if (isset($reduction_currency_id) && isset($reduction_pct)) {
    if (get_community_users($db)) {
        $my_prefix = $testBlock->user_id . '_';
    } else {
        $my_prefix = '';
    }
    $node_private_key = get_node_private_key($db, $my_prefix);
    print $my_prefix . "\n";
    // подписываем нашим нод-ключем данные транзакции
    $data_for_sign = ParseData::findType('new_reduction') . ",{$time},{$my_user_id},{$reduction_currency_id},{$reduction_pct},{$reduction_type}";
    $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__);
    print $data_for_sign;
    print $node_private_key;
    // создаем тр-ию. пишем $block_id, на момент которого были актуальны голоса и статусы банкнот
    $reduction_tx_data = dec_binary(ParseData::findType('new_reduction'), 1) . dec_binary($time, 4) . ParseData::encode_length_plus_data($my_user_id) . ParseData::encode_length_plus_data($reduction_currency_id) . ParseData::encode_length_plus_data($reduction_pct) . ParseData::encode_length_plus_data($reduction_type) . ParseData::encode_length_plus_data($signature);
    insert_tx($reduction_tx_data, $db);
    // и не закрывая main_lock переводим нашу тр-ию в verified=1, откатив все несовместимые тр-ии
    // таким образом у нас будут в блоке только актуальные голоса.
    // а если придет другой блок и станет verified=0, то эта тр-ия просто удалится.
    $new_tx_data['data'] = $reduction_tx_data;
    $new_tx_data['hash'] = hextobin(md5($reduction_tx_data));
    tx_parser($new_tx_data, true);
}
main_unlock();