PageRenderTime 42ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/v1.9/generation.php

https://bitbucket.org/rev22/timekoin
PHP | 187 lines | 120 code | 35 blank | 32 comment | 27 complexity | 7ec1f27768402b608251b9e23e3ffe9a MD5 | raw file
  1. <?PHP
  2. include 'configuration.php';
  3. include 'function.php';
  4. set_time_limit(60);
  5. //***********************************************************************************
  6. //***********************************************************************************
  7. if(GENERATION_DISABLED == TRUE || TIMEKOIN_DISABLED == TRUE)
  8. {
  9. // This has been disabled
  10. exit;
  11. }
  12. //***********************************************************************************
  13. //***********************************************************************************
  14. mysql_connect(MYSQL_IP,MYSQL_USERNAME,MYSQL_PASSWORD);
  15. mysql_select_db(MYSQL_DATABASE);
  16. $loop_active = mysql_result(mysql_query("SELECT * FROM `main_loop_status` WHERE `field_name` = 'generation_heartbeat_active' LIMIT 1"),0,"field_data");
  17. // Check if loop is already running
  18. if($loop_active == 0)
  19. {
  20. // Set the working status of 1
  21. $sql = "UPDATE `main_loop_status` SET `field_data` = '1' WHERE `main_loop_status`.`field_name` = 'generation_heartbeat_active' LIMIT 1";
  22. mysql_query($sql);
  23. }
  24. else
  25. {
  26. // Loop called while still working
  27. exit;
  28. }
  29. //***********************************************************************************
  30. //***********************************************************************************
  31. // Is generation turned on for our server key?
  32. $next_generation_cycle = transaction_cycle(1);
  33. $current_generation_cycle = transaction_cycle(0);
  34. // Can we work on the transactions in the database?
  35. // Not allowed 60 seconds before and 35 seconds after generation cycle.
  36. if(($next_generation_cycle - time()) > 60 && (time() - $current_generation_cycle) > 35)
  37. {
  38. // Generation Peer Check
  39. $sql = "SELECT * FROM `generating_peer_list`";
  40. $sql_result = mysql_query($sql);
  41. $sql_num_results = mysql_num_rows($sql_result);
  42. if($sql_num_results > 0 )
  43. {
  44. for ($i = 0; $i < $sql_num_results; $i++)
  45. {
  46. $sql_row = mysql_fetch_array($sql_result);
  47. $public_key = $sql_row["public_key"];
  48. $last_generation = $sql_row["last_generation"];
  49. if(time() - $last_generation > 7200) // 2 Hours without generation gets the peer removed
  50. {
  51. $sql = "DELETE FROM `generating_peer_list` WHERE `generating_peer_list`.`public_key` = '$public_key'";
  52. mysql_query($sql);
  53. $peer_purge = TRUE;
  54. }
  55. }
  56. if($peer_purge == TRUE)
  57. {
  58. // Update peer list hash to avoid a race condition
  59. $sql = "SELECT * FROM `generating_peer_list` ORDER BY `join_peer_list`";
  60. $sql_result = mysql_query($sql);
  61. $sql_num_results = mysql_num_rows($sql_result);
  62. $generating_hash = 0;
  63. if($sql_num_results > 0)
  64. {
  65. for ($i = 0; $i < $sql_num_results; $i++)
  66. {
  67. $sql_row = mysql_fetch_array($sql_result);
  68. $generating_hash .= $sql_row["public_key"] . $sql_row["join_peer_list"];
  69. }
  70. $generating_hash = hash('md5', $generating_hash);
  71. }
  72. $sql = "UPDATE `options` SET `field_data` = '$generating_hash' WHERE `options`.`field_name` = 'generating_peers_hash' LIMIT 1";
  73. mysql_query($sql);
  74. } // End peer purge check
  75. } // End results check
  76. //***********************************************************************************
  77. // Generation Check
  78. $generation_option = mysql_result(mysql_query("SELECT * FROM `options` WHERE `field_name` = 'generate_currency' LIMIT 1"),0,"field_data");
  79. if($generation_option == "0")
  80. {
  81. // Generation is turned off
  82. }
  83. else
  84. {
  85. // Check to see if we are in the allowed generation peer list
  86. $my_public_key = mysql_result(mysql_query("SELECT * FROM `my_keys` WHERE `field_name` = 'server_public_key' LIMIT 1"),0,"field_data");
  87. $found_public_key = mysql_result(mysql_query("SELECT * FROM `generating_peer_list` WHERE `public_key` = '$my_public_key' LIMIT 1"),0,"join_peer_list");
  88. if(empty($found_public_key) == TRUE)
  89. {
  90. // Check to see if this request is already in my transaction queue
  91. $found_public_trans_queue = mysql_result(mysql_query("SELECT * FROM `my_transaction_queue` WHERE `attribute` = 'R' LIMIT 1"),0,"timestamp");
  92. if(empty($found_public_trans_queue) == TRUE)
  93. {
  94. $my_private_key = mysql_result(mysql_query("SELECT * FROM `my_keys` WHERE `field_name` = 'server_private_key' LIMIT 1"),0,"field_data");
  95. // Generate a network request to be added to the generation peer list
  96. $generation_request = ARBITRARY_KEY . rand(1, 999999);
  97. openssl_private_encrypt($generation_request, $encryptedData1, $my_private_key);
  98. $encryptedData64_1 = base64_encode($encryptedData1);
  99. $duplicate_hash_check = hash('sha256', $generation_request . $generation_request . $generation_request);
  100. $sql = "INSERT INTO `my_transaction_queue` (`timestamp`,`public_key`,`crypt_data1`,`crypt_data2`,`crypt_data3`, `hash`, `attribute`)
  101. VALUES ('" . time() . "', '$my_public_key', '$encryptedData64_1', '$generation_request' , '$generation_request', '$duplicate_hash_check' , 'R')";
  102. mysql_query($sql);
  103. }
  104. }
  105. else
  106. {
  107. // Look into the future with the magic of math to see if the next generation will even be allowed
  108. $str = strval(transaction_cycle(1));
  109. $last3_gen = $str[strlen($str)-3];
  110. TKRandom::seed(transaction_cycle(1, TRUE));
  111. $tk_random_number = TKRandom::num(0, 9);
  112. // Random generation time that can be duplicated across all servers
  113. if($last3_gen + $tk_random_number < 10)
  114. {
  115. $my_private_key = mysql_result(mysql_query("SELECT * FROM `my_keys` WHERE `field_name` = 'server_private_key' LIMIT 1"),0,"field_data");
  116. // Server public key is listed as a qualified generation server.
  117. // Has the server submitted it's currency generation to the transaction queue?
  118. $found_public_key_my_queue = mysql_result(mysql_query("SELECT * FROM `my_transaction_queue` WHERE `attribute` = 'G' LIMIT 1"),0,"timestamp");
  119. $found_public_key_trans_queue = mysql_result(mysql_query("SELECT * FROM `transaction_queue` WHERE `public_key` = '$my_public_key' AND `attribute` = 'G' LIMIT 1"),0,"timestamp");
  120. $join_peer_list = mysql_result(mysql_query("SELECT * FROM `generating_peer_list` WHERE `public_key` = '$my_public_key' LIMIT 1"),0,"join_peer_list");
  121. if(empty($found_public_key_my_queue) == TRUE && empty($found_public_key_trans_queue) == TRUE && (time() - $join_peer_list) >= 3600)
  122. {
  123. // How much can be generated at one time?
  124. $allowed_amount = peer_gen_amount($my_public_key);
  125. //Not found, add it to transaction queue
  126. $arr1 = str_split($my_public_key, 181);
  127. openssl_private_encrypt($arr1[0], $encryptedData1, $my_private_key);
  128. $encryptedData64_1 = base64_encode($encryptedData1);
  129. openssl_private_encrypt($arr1[1], $encryptedData2, $my_private_key);
  130. $encryptedData64_2 = base64_encode($encryptedData2);
  131. $transaction_data = "AMOUNT=$allowed_amount---TIME=" . time() . "---HASH=" . hash('sha256', $encryptedData64_1 . $encryptedData64_2);
  132. openssl_private_encrypt($transaction_data, $encryptedData3, $my_private_key);
  133. $encryptedData64_3 = base64_encode($encryptedData3);
  134. $duplicate_hash_check = hash('sha256', $encryptedData64_1 . $encryptedData64_2 . $encryptedData64_3);
  135. $sql = "INSERT INTO `my_transaction_queue` (`timestamp`,`public_key`,`crypt_data1`,`crypt_data2`,`crypt_data3`, `hash`, `attribute`)
  136. VALUES ('" . time() . "', '$my_public_key', '$encryptedData64_1', '$encryptedData64_2' , '$encryptedData64_3', '$duplicate_hash_check' , 'G')";
  137. mysql_query($sql);
  138. }
  139. } // Future generation allowed check
  140. } // Public Key Check
  141. } // Generation enabled check
  142. //***********************************************************************************
  143. } // End Time allowed check
  144. //***********************************************************************************
  145. //***********************************************************************************
  146. // Script finished, set status to 0
  147. $sql = "UPDATE `main_loop_status` SET `field_data` = '0' WHERE `main_loop_status`.`field_name` = 'generation_heartbeat_active' LIMIT 1";
  148. mysql_query($sql);
  149. // Record when this script finished
  150. $sql = "UPDATE `main_loop_status` SET `field_data` = '" . time() . "' WHERE `main_loop_status`.`field_name` = 'generation_last_heartbeat' LIMIT 1";
  151. mysql_query($sql);
  152. ?>