curl_setopt($ch, CURLOPT_POST, 1); 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']})");
if (!$current_block_id) { if ($config['first_load_blockchain'] == 'file') { debug_print('download blockchain', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); downloadFile('http://dcoin.me/blockchain', ABSPATH . 'public/blockchain'); //file_put_contents(ABSPATH . 'public/blockchain', fopen('http://github.com/c-darwin/dcoin_blocks/raw/master/blockchain-27-08-14', 'r')); } $first = true; if (file_exists(ABSPATH . 'public/blockchain') && filesize(ABSPATH . 'public/blockchain') > 52000000) { debug_print('file_exists blockchain', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $fp = fopen(ABSPATH . 'public/blockchain', 'r'); do { $data_size = binary_dec(fread($fp, 5)); if ($data_size) { $data_binary = fread($fp, $data_size); $block_id = binary_dec(string_shift($data_binary, 5)); $data_length = ParseData::decode_length($data_binary); $block_data_binary = string_shift($data_binary, $data_length); $parsedata = new ParseData($block_data_binary, $db); if ($first) { $parsedata->current_version = trim(file_get_contents(ABSPATH . 'version')); $first = false; } $error = $parsedata->ParseDataFull(); if ($error) { print $error; break; } $parsedata->insert_into_blockchain(); // отметимся в БД, что мы живы. upd_deamon_time($db); // отметимся, чтобы не спровоцировать очистку таблиц
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; }
debug_print('$binary_data=' . $binary_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // Разбираем полученные бинарные данные. $new_testblock['block_id'] = ParseData::binary_dec_string_shift($binary_data, 4); $new_testblock['time'] = ParseData::binary_dec_string_shift($binary_data, 4); $new_testblock['user_id'] = ParseData::binary_dec_string_shift($binary_data, 5); $sign_size = ParseData::decode_length($binary_data); $new_testblock['signature'] = ParseData::string_shift($binary_data, $sign_size); $new_testblock['signature_hex'] = bin2hex($new_testblock['signature']); debug_print($new_testblock, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // недостающие тр-ии $length = ParseData::decode_length($binary_data); // размер всех тр-ий $tr_binary = ParseData::string_shift($binary_data, $length); do { // берем по одной тр-ии $length = ParseData::decode_length($tr_binary); print '$length=' . $length . "\n"; if ($length == 0) { break; } $tr = ParseData::string_shift($tr_binary, $length); $tr_array[md5($tr)] = $tr; } while (true); // порядок тр-ий $order_array = array(); do { if ($binary_data) { $order_array[] = bin2hex(ParseData::string_shift($binary_data, 16)); } } while ($binary_data); $order_array = array_flip($order_array);
}*/ } else { //main_unlock(); // т.к. testblock_generator.php пишет в таблы testblock и transactions_testblock нужно локать эти таблы //testblock_lock(); // наши тр-ии уже не актуальны, т.к. мы их откатили $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tTRUNCATE TABLE `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t"); // если всё нормально, то пишем в таблу testblock новые тр-ии и новые данные по юзеру их сгенерившему $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tUPDATE `" . DB_PREFIX . "testblock`\n\t\t\t\tSET `time` = {$parsedata->block_data['time']},\n\t\t\t\t\t\t`user_id` = {$parsedata->block_data['user_id']},\n\t\t\t\t\t\t`header_hash` = 0x{$new_header_hash},\n\t\t\t\t\t\t`signature` = 0x" . bin2hex($parsedata->block_data['sign']) . ",\n\t\t\t\t\t\t`mrkl_root` = 0x{$parsedata->mrkl_root}\n\t\t\t\t"); ////debug_print($db->printsql()."\nAffectedRows=".$db->getAffectedRows() , __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // и сами тр-ии пишем в отдельную таблу if ($tx) { do { debug_print('$tx=' . $tx, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$tx hex=' . bin2hex($tx), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $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");