Beispiel #1
0
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']})");
Beispiel #2
0
 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);
                 // отметимся, чтобы не спровоцировать очистку таблиц
Beispiel #3
0
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;
}
Beispiel #4
0
 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");