Пример #1
0
function rollback_to_block_id($block_id, $db)
{
    rollback_transactions($db);
    rollback_transactions_testblock($db, true);
    $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tTRUNCATE TABLE `" . DB_PREFIX . "testblock`\n\t\t\t");
    // откатываем наши блоки
    $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\n\t\t\tFROM `" . DB_PREFIX . "block_chain`\n\t\t\tWHERE `id` > {$block_id}\n\t\t\tORDER BY `id` DESC\n\t\t\t");
    while ($row = $db->fetchArray($res)) {
        debug_print($row, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
        $LOG_MARKER = "Откатываем наши блоки до блока {$block_id}";
        $parsedata = new ParseData($row['data'], $db);
        $parsedata->ParseDataRollback();
        unset($parsedata);
        $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tDELETE\n\t\t\t\tFROM `" . DB_PREFIX . "block_chain`\n\t\t\t\tWHERE `id` = {$row['id']}\n\t\t\t\t");
    }
    $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\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');
    ParseData::string_shift($data['data'], 1);
    $block_data['block_id'] = ParseData::binary_dec_string_shift($data['data'], 4);
    $block_data['time'] = ParseData::binary_dec_string_shift($data['data'], 4);
    $block_data['user_id'] = ParseData::binary_dec_string_shift($data['data'], 5);
    $block_data['level'] = ParseData::binary_dec_string_shift($data['data'], 1);
    $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tUPDATE `" . DB_PREFIX . "info_block`\n\t\t\tSET  `hash` = 0x" . bin2hex($data['hash']) . ",\n\t\t\t\t\t`head_hash` = 0x" . bin2hex($data['head_hash']) . ",\n\t\t\t\t\t`block_id` = {$block_data['block_id']},\n\t\t\t\t\t`time` = {$block_data['time']},\n\t\t\t\t\t`level` = {$block_data['level']}\n\t\t\t");
}
Пример #2
0
                $tx_size = ParseData::decode_length($tx);
                // отчекрыжим одну транзакцию от списка транзакций
                $tx_binary_data = ParseData::string_shift($tx, $tx_size);
                // получим тип тр-ии и юзера
                // $type, $user_id, $to_user_id точно валидные, т.к. прошли фронт.проверку выше
                list($type, $user_id, $to_user_id) = get_tx_type_and_user_id($tx_binary_data);
                $md5 = md5($tx_binary_data);
                list(, $data_hex) = unpack("H*", $tx_binary_data);
                $file = save_tmp_644('FTT', "{$md5}\t{$data_hex}\t{$type}\t{$user_id}\t{$to_user_id}");
                $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tLOAD DATA LOCAL INFILE  '{$file}'\n\t\t\t\t\t\tREPLACE INTO TABLE `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\tFIELDS TERMINATED BY '\t'\n\t\t\t\t\t\t(@hash, @data, `type`, `user_id`, `third_var`)\n\t\t\t\t\t\tSET `hash` = UNHEX(@hash),\n\t\t\t\t\t\t\t   `data` = UNHEX(@data)\n\t\t\t\t\t\t");
                unlink($file);
                ////debug_print($db->printsql()."\nAffectedRows=".$db->getAffectedRows() , __FILE__, __LINE__,  __FUNCTION__,  __CLASS__, __METHOD__);
            } while ($tx);
        }
        // удаляем всё, где хэш больше нашего
        $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tDELETE FROM `" . DB_PREFIX . "queue_testblock`\n\t\t\t\tWHERE `head_hash` > 0x{$new_header_hash}\n\t\t");
        ////debug_print($db->printsql()."\nAffectedRows=".$db->getAffectedRows() , __FILE__, __LINE__,  __FUNCTION__,  __CLASS__, __METHOD__);
        #############################################
        // возможно нужно откатить и тр-ии с verified=1 и used=0 из transactions
        // т.к. в transactions может быть тр-ия на удаление банкноты
        // и в transactions_testblock только что была залита такая же тр-ия
        // выходит, что блок, который будет сгенерен на основе transactions будет ошибочным
        // или при откате transactions будет сделан вычет из log_time_....
        // и выйдет что попавшая в блок тр-я из transactions_testblock попала минуя запись  log_time_....
        ############################################
        rollback_transactions($db);
    }
    unset($parsedata);
    testblock_unlock();
    sleep(1);
} while (true);