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"); }
$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);