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
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>'; } } ?>
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();
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__); }