From 13e321cb02fa351e5793db801e22c2aa743e2489 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Fri, 27 Jun 2014 14:37:21 +0200 Subject: [PATCH] Lesser constants and more rewrites on algo. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- contrib/chash/chash.php | 97 ++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 41 deletions(-) diff --git a/contrib/chash/chash.php b/contrib/chash/chash.php index d6126e39..f00c8391 100644 --- a/contrib/chash/chash.php +++ b/contrib/chash/chash.php @@ -1,16 +1,17 @@ array()); @@ -32,7 +33,7 @@ $GLOBALS['found_hashes'] = array(0 => array()); */ function hashString ($str) { // Calculate strong hash from given string - $hash = mhash(HASH_ALGO, $str); + $hash = mhash($GLOBALS['hash_algo'], $str); // Return it hexadecimal-encoded return bin2hex($hash); @@ -46,14 +47,11 @@ function hashString ($str) { * @return $hash The generated hash */ function multipleHashString ($str) { - // One less to go (see below) - $totalHashes = $GLOBALS['cycles'] - 1; - // Generate hash from given hash $hash = hashString($str); // Now over-hash it - for ($idx = 0; $idx < $totalHashes; $idx++) { + for ($idx = 0; $idx < ($GLOBALS['hash_cycles'] - 1); $idx++) { // Over-hash the given hash $hash = hashString($hash); } // END - for @@ -178,7 +176,7 @@ function calculateSumFromHash ($hash) { // Loop through hash for ($idx = 0; $idx < (strlen($hash) / 2); $idx++) { // And add it - $sum = $sum + (hexdec(substr($hash, $idx, 2)) * $idx & 256); + $sum = $sum + hexdec(substr($hash, $idx, 2)); } // END - for // And return it @@ -192,7 +190,7 @@ function calculateSumFromHash ($hash) { */ function calculateNonce () { // Linear incrementation - $GLOBALS['nonce'] = $GLOBALS['nonce'] + NONCE_INCREMENT; + $GLOBALS['nonce'] = $GLOBALS['nonce'] + $GLOBALS['none_increment']; } /** @@ -209,7 +207,7 @@ function flushCheckPointFile ($hash) { $timer = microtime(TRUE); // Flush data - file_put_contents(CHECK_POINT, $GLOBALS['total_blocks'] . ':' . $GLOBALS['total_reward'] . ':' . $GLOBALS['total_hashes'] . ':' . $GLOBALS['cycles'] . ':' . base64_encode($GLOBALS['nonce']) . ':' . $hash . ':' . $GLOBALS['root_hash'] . ':' . base64_encode(gzcompress(serialize($GLOBALS['found_hashes'])))); + file_put_contents(CHECK_POINT, $GLOBALS['total_blocks'] . ':' . $GLOBALS['total_reward'] . ':' . $GLOBALS['total_hashes'] . ':' . $GLOBALS['hash_cycles'] . ':' . base64_encode($GLOBALS['nonce']) . ':' . $hash . ':' . $GLOBALS['root_hash'] . ':' . base64_encode(gzcompress(serialize($GLOBALS['found_hashes'])))); // Set time $GLOBALS['time_flush'] = microtime(TRUE); @@ -222,6 +220,9 @@ function flushCheckPointFile ($hash) { * @param $hash Hash to save */ function addFoundHash ($hash) { + // Increment counter + $GLOBALS['current_hashes']++; + // Add hash to array array_push($GLOBALS['found_hashes'][$GLOBALS['total_blocks']], array( 'modula_hash' => $GLOBALS['modula_hash'], @@ -230,11 +231,12 @@ function addFoundHash ($hash) { 'nonce' => $GLOBALS['nonce'], 'iter' => $GLOBALS['iteration'], 'hashes_block' => $GLOBALS['hashes_block'], + 'hash_cycles' => $GLOBALS['hash_cycles'], 'nonce_hash' => $hash )); // Found hash: - print ('FOUND: hash=' . $hash . ',nonce=' . $GLOBALS['nonce'] . ',iteration=' . $GLOBALS['iteration'] . ',foundTime()=' . (microtime(TRUE) - $GLOBALS['found_time'] ) . PHP_EOL); + print ('FOUND: hash=' . $hash . ',nonce=' . $GLOBALS['nonce'] . ',current_hashes=' . $GLOBALS['current_hashes'] . PHP_EOL); // Set time as a new hash was found $GLOBALS['found_time'] = microtime(TRUE); @@ -243,7 +245,7 @@ function addFoundHash ($hash) { flushCheckPointFile($hash); // Use nonceHash as next modula hash - $GLOBALS['modula_hash'] = $hash; + setModulaHash($hash); } /** @@ -256,6 +258,17 @@ function initNonce () { print (__FUNCTION__ . ': nonce=' . $GLOBALS['nonce'] . PHP_EOL); } +/** + * Sets modula hash and calculates sum of it + * + * @param $hash Hash to set as "modula hash" + * @return void + */ +function setModulaHash ($hash) { + $GLOBALS['modula_hash'] = $hash; + $GLOBALS['sum_modula'] = calculateSumFromHash($GLOBALS['modula_hash']); +} + /* * Calculate "genesis" hashes, please note that these "genesis strings" are now * known to the public as you can read them here in source code and therefore I @@ -299,7 +312,7 @@ $sqrtHashes = array( ); // Calulcate modula hash -$GLOBALS['modula_hash'] = multipleHashString(modulaHash($sqrtHashes[0], $sqrtHashes[1])); +setModulaHash(multipleHashString(modulaHash($sqrtHashes[0], $sqrtHashes[1]))); // This is also the "genesis" hash and first root hash $GLOBALS['genesis_hash'] = $GLOBALS['modula_hash']; @@ -312,10 +325,11 @@ print ('sqrtHashes=' . print_r($sqrtHashes, TRUE)); print ('modulaHash=' . $GLOBALS['modula_hash'] . PHP_EOL); // Total reward + hashes -$GLOBALS['total_reward'] = 0; -$GLOBALS['total_hashes'] = 0; -$GLOBALS['total_blocks'] = 0; -$GLOBALS['found_time'] = microtime(TRUE); +$GLOBALS['total_reward'] = 0; +$GLOBALS['total_hashes'] = 0; +$GLOBALS['total_blocks'] = 0; +$GLOBALS['current_hashes'] = 0; +$GLOBALS['found_time'] = microtime(TRUE); // Is the check point there? if (is_readable(CHECK_POINT)) { @@ -332,11 +346,13 @@ if (is_readable(CHECK_POINT)) { $GLOBALS['total_blocks'] = $data[0]; $GLOBALS['total_reward'] = $data[1]; $GLOBALS['total_hashes'] = $data[2]; - $GLOBALS['cycles'] = intval($data[3]); + $GLOBALS['hash_cycles'] = intval($data[3]); $GLOBALS['nonce'] = base64_decode($data[4]); - $GLOBALS['modula_hash'] = $data[5]; $GLOBALS['root_hash'] = $data[6]; $GLOBALS['found_hashes'] = unserialize(gzuncompress(base64_decode($data[7]))); + + // Set modula hash + setModulaHash($data[5]); } else { // Create nonce (small) initNonce(); @@ -353,7 +369,7 @@ while (TRUE) { $GLOBALS['hashes_block'] = 0; $hashrate = 0; - // Wait for BLOCK_SIZE iterations (= found hashes). This is one block + // Wait for block_size iterations (= found hashes). This is one block $timeBlock = microtime(TRUE); $timeDisplay = $timeBlock; $GLOBALS['time_flush'] = $timeBlock; @@ -361,13 +377,12 @@ while (TRUE) { // Time waited for a good block again (no iteration) $timeBadHashes = 0; - while (count($GLOBALS['found_hashes'][$GLOBALS['total_blocks']]) <= BLOCK_SIZE) { + while (count($GLOBALS['found_hashes'][$GLOBALS['total_blocks']]) <= $GLOBALS['block_size']) { // Create hash from modulaHash ("genesis hash") and nonce - $nonceHash = multipleHashString($GLOBALS['modula_hash'] . $GLOBALS['nonce']); + $nonceHash = multipleHashString($GLOBALS['nonce'] . $GLOBALS['modula_hash']); // Calculate sums $sumNonce = calculateSumFromHash($nonceHash); - $sumModula = calculateSumFromHash($GLOBALS['modula_hash']); // Init counter $GLOBALS['iteration'] = 0; @@ -375,12 +390,12 @@ while (TRUE) { // Now start the "mining" ... $timeHash = microtime(TRUE); - while ($sumNonce >= $sumModula) { + while ($sumNonce < $GLOBALS['sum_modula']) { // Calculate new nonce calculateNonce(); // And hash again - $nonceHash = multipleHashString($GLOBALS['modula_hash'] . $GLOBALS['nonce']); + $nonceHash = multipleHashString($GLOBALS['nonce'] . $GLOBALS['modula_hash']); // Calculate sums $sumNonce = calculateSumFromHash($nonceHash); @@ -389,7 +404,7 @@ while (TRUE) { $testTime = abs(microtime(TRUE) - $timeDisplay); // Calculate hashrate/sec - $hashrate = 1 / $testTime * $GLOBALS['iteration_second'] * $GLOBALS['cycles']; + $hashrate = 1 / $testTime * $GLOBALS['iteration_second'] * $GLOBALS['hash_cycles']; // Only every second if ($testTime >= 1) { @@ -405,7 +420,7 @@ while (TRUE) { $testTime = abs(microtime(TRUE) - $GLOBALS['time_flush']); // Only once per 10 seconds - if ($testTime >= FLUSH_BLOCKS_FILE_TIME) { + if ($testTime >= $GLOBALS['flush_file_time']) { // Flush check-point file flushCheckPointFile($GLOBALS['modula_hash']); } // END - if @@ -414,7 +429,7 @@ while (TRUE) { $testTime = abs(microtime(TRUE) - $GLOBALS['found_time']); // Is the last found time to far away? - if ($testTime >= RESTART_SEARCH_TIME) { + if ($testTime >= $GLOBALS['restart_search_time']) { // Count all root (genesis) hashes $rootHashes = array(); foreach ($GLOBALS['found_hashes'] as $block) { @@ -455,13 +470,13 @@ while (TRUE) { // Search for latest best root hash foreach ($GLOBALS['found_hashes'] as $block) { - // "Walk" through whole block counter-wise - for ($idx = (count($block) - 1); $idx > 0; $idx--) { + // "Walk" through whole block and search for first appearance of best root hash + foreach ($block as $idx => $hash) { // Is the root hash there? - if ($block[$idx]['root_hash'] == $bestRootHash) { + if ($hash['root_hash'] == $bestRootHash) { // Set found modula hash as new root and current modula hash - $GLOBALS['root_hash'] = $block[$idx]['modula_hash']; - $GLOBALS['modula_hash'] = $block[$idx]['modula_hash']; + $GLOBALS['root_hash'] = $hash['nonce_hash']; + setModulaHash($hash['nonce_hash']); print ('idx=' . $idx . ',modulaHash=' . $GLOBALS['root_hash'] . ' - Is now new root hash!' . PHP_EOL); // Reset "found time" (when a hash was found) @@ -483,7 +498,7 @@ while (TRUE) { //print ('nonce=' . $GLOBALS['nonce'] . ',iteration=' . $GLOBALS['iteration'] . PHP_EOL); //print ('nonceHash=' . $nonceHash . PHP_EOL); //print ('sumNonce=' . $sumNonce . PHP_EOL); - //print ('sumModula=' . $sumModula . PHP_EOL); + //print ('sumModula=' . $GLOBALS['sum_modula'] . PHP_EOL); } // END - while // If the iteration is zero, then no hash is found @@ -500,7 +515,7 @@ while (TRUE) { } // END - if // Add amount of hashes per block (multiple-hash) - $GLOBALS['hashes_block'] += $GLOBALS['iteration'] * $GLOBALS['cycles'] + $GLOBALS['cycles']; + $GLOBALS['hashes_block'] += $GLOBALS['iteration'] * $GLOBALS['hash_cycles'] + $GLOBALS['hash_cycles']; // Push found hash addFoundHash($nonceHash); @@ -510,7 +525,7 @@ while (TRUE) { $timeBlock = abs(microtime(TRUE) - $timeBlock); // Calculate reward - $reward = abs($timeBlock - $timeBadHashes) / $hashrate * $GLOBALS['hashes_block'] / BLOCK_SIZE * 1000; + $reward = abs($timeBlock - $timeBadHashes) / $hashrate * $GLOBALS['hashes_block'] / $GLOBALS['block_size'] * 1000; print ('timeBlock=' . $timeBlock . ',timeBadHashes=' . $timeBadHashes . ',hashesPerBlock=' . $GLOBALS['hashes_block'] .',reward=' . $reward . PHP_EOL); // Block completed @@ -528,7 +543,7 @@ while (TRUE) { $GLOBALS['total_reward'] += $reward; // Calculate average block value - $blockValue = $GLOBALS['total_reward'] / $GLOBALS['total_blocks'] * $GLOBALS['total_hashes'] / (BLOCK_SIZE * $GLOBALS['total_blocks']); + $blockValue = $GLOBALS['total_reward'] / $GLOBALS['total_blocks'] * $GLOBALS['total_hashes'] / ($GLOBALS['block_size'] * $GLOBALS['total_blocks']); // Calculate reward per hour (= 3600 seconds) $rewardPerHour = $GLOBALS['total_reward'] / abs(microtime(TRUE) - START_TIME) * 3600; -- 2.30.2