Esempio n. 1
0
 SIGN                               от 128 байта до 512 байт. Подпись от TYPE, BLOCK_ID, PREV_BLOCK_HASH, TIME, USER_ID, LEVEL, MRKL_ROOT
 Далее - тело блока (Тр-ии)
 */
 // подписываем нашим нод-ключем заголовок блока
 $rsa = new Crypt_RSA();
 $rsa->loadKey($node_private_key);
 $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
 //$rsa->setHash('sha256');
 $for_sign = "0,{$new_block_id},{$testBlock->prev_block['hash']},{$time},{$my_user_id},{$testBlock->level},{$mrkl_root}";
 debug_print('$for_sign=' . $for_sign, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 $signature = $rsa->sign($for_sign);
 unset($rsa);
 list(, $signature_hex) = unpack("H*", $signature);
 debug_print('$signature_hex = ' . $signature_hex, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 // хэш шапки блока. нужен для сравнивания с другими и у кого будет меньше - у того блок круче
 $header_hash = ParseData::dsha256("{$my_user_id},{$new_block_id},{$prev_head_hash}");
 debug_print("header_hash={$header_hash}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 $data = "{$new_block_id}\t{$time}\t{$testBlock->level}\t{$my_user_id}\t{$header_hash}\t{$signature_hex}\t{$mrkl_root}";
 debug_print($data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 $file = save_tmp_644('FTB', $data);
 // для тестов получим что там есть
 $tmp_testblock_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\n\t\t\tFROM `" . DB_PREFIX . "testblock`\n\t\t\t", 'fetch_array');
 debug_print($tmp_testblock_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 debug_print("LOAD DATA LOCAL INFILE  '{$file}' REPLACE INTO TABLE `" . DB_PREFIX . "testblock`", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 // т.к. эти данные создали мы сами, то пишем их сразу в таблицу проверенных данных, которые будут отправлены другим нодам
 $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tLOAD DATA LOCAL INFILE  '{$file}' REPLACE INTO TABLE `" . DB_PREFIX . "testblock`\n\t\t\tFIELDS TERMINATED BY '\t'\n\t\t\t(`block_id`,`time`,`level`,`user_id`, @header_hash, @signature, @mrkl_root)\n\t\t\tSET `header_hash` = UNHEX(@header_hash),\n\t\t\t\t   `signature` = UNHEX(@signature),\n\t\t\t\t   `mrkl_root` = UNHEX(@mrkl_root)\n\t\t\t");
 unlink($file);
 // иногда не вставлялось, т.к. уже что-то было в testblock . добавил REPLACE
 debug_print('AffectedRows=' . $db->getAffectedRows(), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 /// #######################################
 // Отмечаем транзакции, которые попали в transactions_testblock
Esempio n. 2
0
        print "<tr><td><strong>User_id</strong></td><td>{$block_data['user_id']}</td></tr>";
        print "<tr><td><strong>Level</strong></td><td>{$block_data['level']}</td></tr>";
        print "<tr><td><strong>Sign</strong></td><td>" . chunk_split($block_data['sign'], 130) . "</td></tr>";
        if ($tx_array) {
            //print sizeof($tx_array);
            print "<tr><td><strong>Transactions</strong></td><td><div><pre>";
            for ($i = 0; $i < sizeof($tx_array); $i++) {
                foreach ($tx_array[$i] as $k => $v) {
                    if (in_array($k, $bin_to_hex_array)) {
                        $tx_array[$i][$k] = bin2hex($v);
                    }
                    if ($k == 'file') {
                        $tx_array[$i][$k] = 'file size: ' . strlen($v);
                    }
                    if ($k == 'code') {
                        $tx_array[$i][$k] = ParseData::dsha256($v);
                    }
                }
            }
            print_R($tx_array);
            print "</pre></div></td></tr>";
        }
        //else
        //	print '0';
        //print "</td>";
        //print "<td><div style=\"width: 300px; height: 40px; overflow: auto; background-color: #f2dede\">{$block_data['sign']}</div></td>";
        //print "</tr>";
        print '</table>';
    }
}
?>
Esempio n. 3
0
function encrypt_data($data, $public_key, $db, &$key = '')
{
    // генерим ключ
    $rand_testblock_hash = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `head_hash`\n\t\t\t\t\tFROM `" . DB_PREFIX . "queue_testblock`\n\t\t\t\t\tORDER BY RAND() LIMIT 1\n\t\t\t\t\t", 'fetch_array');
    $key = ParseData::dsha256(microtime() . rand() . $rand_testblock_hash . generate_token(128));
    debug_print('$key=' . $key, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    debug_print('$public_key=' . bin2hex($public_key), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    // шифруем ключ публичным ключем получателя
    $rsa = new Crypt_RSA();
    $rsa->loadKey($public_key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $encrypted_key = $rsa->encrypt($key);
    unset($rsa);
    debug_print('$binary_data=' . $data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    debug_print('$binary_data(hex)=' . bin2hex($data), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
    // шифруем сам блок/тр-ию
    $aes = new Crypt_AES();
    $aes->setKey($key);
    $encrypted_data = $aes->encrypt($data);
    unset($aes);
    return ParseData::encode_length_plus_data($encrypted_key) . $encrypted_data;
}
        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. 5
0
 public function upd_block_info()
 {
     $block_id = $this->block_data['block_id'];
     // для локальных тестов
     if ($this->block_data['block_id'] == 1) {
         $ini_array = parse_ini_file(ABSPATH . "config.ini", true);
         if (isset($ini_array['local']['start_block_id'])) {
             $block_id = $ini_array['local']['start_block_id'];
         }
     }
     $head_hash_data = "{$this->block_data['user_id']},{$block_id},{$this->prev_block['head_hash']}";
     $this->block_data['head_hash'] = ParseData::dsha256($head_hash_data);
     debug_print("head_hash={$this->block_data['head_hash']}\n", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
     $for_sha = "{$block_id},{$this->prev_block['hash']},{$this->mrkl_root},{$this->block_data['time']},{$this->block_data['user_id']},{$this->block_data['level']}";
     debug_print("for_sha={$for_sha}\n", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
     $this->block_data['hash'] = ParseData::dsha256($for_sha);
     debug_print("hash={$this->block_data['hash']}\n", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
     if ($this->block_data['block_id'] == 1) {
         $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tINSERT INTO `" . DB_PREFIX . "info_block` (\n\t\t\t\t\t`hash`,\n\t\t\t\t\t`head_hash`,\n\t\t\t\t\t`block_id`,\n\t\t\t\t\t`time`,\n\t\t\t\t\t`level`,\n\t\t\t\t\t`current_version`\n\t\t\t\t) VALUES (\n\t\t\t\t\t0x{$this->block_data['hash']},\n\t\t\t\t\t0x{$this->block_data['head_hash']},\n\t\t\t\t\t{$block_id},\n\t\t\t\t\t{$this->block_data['time']},\n\t\t\t\t\t{$this->block_data['level']},\n\t\t\t\t\t'{$this->current_version}'\n\t\t\t\t)");
     } else {
         $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tUPDATE `" . DB_PREFIX . "info_block`\n\t\t\t\t\tSET  `hash` = 0x{$this->block_data['hash']},\n\t\t\t\t\t\t\t`head_hash` = 0x{$this->block_data['head_hash']},\n\t\t\t\t\t\t\t`block_id`= {$block_id},\n\t\t\t\t\t\t\t`time`= {$this->block_data['time']},\n\t\t\t\t\t\t\t`level`= {$this->block_data['level']},\n\t\t\t\t\t\t\t`sent` = 0\n\t\t\t\t\t");
         $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tUPDATE `" . DB_PREFIX . "config`\n\t\t\t\t\tSET `my_block_id` = {$block_id}\n\t\t\t\t\tWHERE `my_block_id` < {$block_id}\n\t\t\t\t\t");
     }
     debug_print("{$this->db->printsql()}\n", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 }