Advertisement
Guest User

Untitled

a guest
Apr 7th, 2013
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package main
  2.      
  3. import (
  4.     "os"
  5.     "fmt"
  6.     "strconv"
  7.     "math/rand"
  8.     "math"
  9.     "flag"
  10.     "time"
  11. )
  12.      
  13.      
  14.      
  15.      
  16. //var percent = 0.00000011946
  17. var pi = math.Pi;// float64(3.1415926535897932384626433832795)
  18. var coef10 = float64(10)/math.Log(10)
  19. var year = 365.25
  20. var year_blocks = int(30*24*year)
  21. var percent_year = math.Pi / 100 + 1.0;
  22. var percent_day_multi = math.Pow(1+percent_year, float64(1.0/year))
  23. var percent_block = (percent_day_multi - 1) / 720.0
  24. var second_in_block = 2 * 60
  25.  
  26. var powp4 = 20.0
  27. var powp3 = 0.0
  28. // *= 1 + pow4 / (X + pow3) - year pow multi
  29. var powp0 = 12
  30. var powp1 = .75
  31. var powp2 = .05
  32. // year 0: +- 75% delta, year 1: +- 70% delta, ..., year pow0: +-15% delta, ..., year pow0+: +-(pow1 - pow0*pow2)*100% delta
  33.  
  34. var start_pow_power = float64(10.0)
  35. var ideal_pow_power = start_pow_power;
  36. var default_pos_power = float64(1.0)
  37. var max_target = uint64(0x00ffffffffffffff)
  38. var pow_target = max_target
  39. var pos_target = max_target
  40.      
  41. var Coin = uint64(1000000)
  42. var Cent = uint64(10000)
  43.      
  44. var mplus, wMplus, sMplus float64
  45.      
  46. var wDiff = float64(1.0)
  47. var sDiff = 0.0001
  48.      
  49. var supply = 0.0//moneysupply
  50. var M = uint64(supply)
  51.      
  52. var second [5040]uint64
  53. var is_pos [5040]bool
  54. var array_index = uint(0);
  55. var prev_index = uint(0);
  56. var Qpos = 0;
  57. var p_pos = 0.25;
  58.      
  59. func main() {
  60.     flag.Parse()
  61.     fl, _ := strconv.ParseInt(flag.Arg(0), 10, 8)
  62.     eot := year_blocks * int(fl) + 1
  63.     wReward := 0.0
  64.     sReward := 0.0
  65.     mwReward := 0.0;
  66.     msReward := 0.0
  67.     ywReward := 0.0;
  68.     ysReward := 0.0
  69.     for i:= 0; i<5040; i++{
  70.         second[i]=0;
  71.         is_pos[i]=false;
  72.     }
  73.     second[0]=1;
  74.     fmt.Println("PoS: Fees=", eot)
  75.     //years to mine in blocks
  76.     //    fmt.Println(eot)
  77.     //    os.Exit(0)
  78.     rnd := rand.New(rand.NewSource(int64(time.Now().Nanosecond())))
  79.     current_pow_power := ideal_pow_power;
  80.     for block := 0; block < eot; block++ {
  81. //  for block := 0; block < 9600; block++ {
  82.         if (block % (720 * 30)) == 0{
  83.             month := block / (720*30) + 1;
  84.             multi_pow := math.Exp(math.Log(1 + 12 * powp4 / float64(month)) / 12)
  85.             ideal_pow_power = ideal_pow_power * multi_pow;
  86.             if (block % 720) == 0{
  87.                 delta_y := block / year_blocks;
  88.                 if delta_y > powp0 {delta_y = powp0}
  89.                 current_pow_power = (1.0 - ((powp1 - float64(delta_y) * powp2) * (1 - 2 * rnd.Float64()))) * ideal_pow_power;
  90.             }
  91.         }
  92.         prev_index = array_index;
  93.         array_index++;
  94.         if array_index == 5040 {array_index = 0}
  95.         delta_time := second[prev_index] - second[array_index];
  96.  
  97.         multi_pow_target := float64(1.0);
  98.         if block < 5040 {
  99.             if block > 0{
  100.                 multi_pow_target *= float64(delta_time) / float64(second_in_block * block)
  101.             }
  102.         }else{
  103.             multi_pow_target *= float64(delta_time) / float64(second_in_block * 5040)
  104.         }
  105.         global_system_time := second[prev_index];
  106.         if block > 5040{
  107.             multi_pow_target *= float64(global_system_time) / float64(block * second_in_block)
  108.         }
  109.         if (multi_pow_target > 1.01) {multi_pow_target = 1.01}
  110.         if (multi_pow_target < 0.99) {multi_pow_target = .99}
  111.         pow_target = uint64(float64(pow_target) * multi_pow_target)
  112.         if pow_target > max_target {pow_target = max_target}
  113.        
  114.         if Qpos == 0{
  115.             pos_target = max_target;
  116.         }else{
  117.             pos_target = uint64(float64(pos_target) * p_pos * float64(5040) / (float64(Qpos))) + 1
  118.         }
  119.  
  120.         p0 := 1.0 / float64(second_in_block);
  121.         p0 *= current_pow_power / start_pow_power;
  122.         p0 *= float64(pow_target)/float64(max_target);
  123.        
  124.         if (p0 >=1) {p0 = .9999999};
  125.         // S(n) = 1 - q^n
  126.         time_to_pow := uint64(math.Log(.005 + .99 * rnd.Float64()) / math.Log(1 - p0));
  127.  
  128.         p0 = float64(max_target)/float64(pow_target) / (current_pow_power/start_pow_power)
  129.        
  130.         pos_coin := (float64(M)/float64(Coin)) * 0.5;
  131.         // 60 - dney v srednev, p_pos - %pos blokov; razmazyvaem monety po blokam.
  132.         pos_coin *= p_pos / (60 * 720)
  133.         pos_time := 30 + 60 * rnd.Float64();
  134.         if (block < 30 * 720) {
  135.             pos_time = 0
  136.         }else if block < 90 * 720{
  137.             pos_time = 30 + float64(block/720 - 30) * rnd.Float64();
  138.         }
  139.        
  140.         coin_age := pos_coin * pos_time / year;
  141.         p1 := 1.0 / float64(second_in_block);
  142.         p1 *= default_pos_power / start_pow_power;
  143.         p1 *= float64(pos_target)*coin_age/float64(max_target);
  144.         if (p1 >= 1) {p1 = .9999999}
  145.         time_to_pos := uint64(math.Log(.005 + .99 * rnd.Float64()) / math.Log(1 - p1));
  146.  
  147.         if time_to_pow < time_to_pos{
  148.             reward_ln := 10 + coef10 * math.Log(float64(max_target)/float64(pow_target));
  149.             reward_percent := float64(M) * percent_block / float64(Coin);
  150.             wReward = reward_ln + reward_percent;
  151.             if is_pos[array_index] {Qpos--; is_pos[array_index] = false;}
  152.             second[array_index] = second[prev_index] + time_to_pow;
  153.             M += uint64(float64(Coin)*wReward);
  154.             mwReward += wReward
  155.             ywReward += wReward
  156. //          fmt.Println("PoW: ", wReward)
  157.         }else{
  158.             sReward = coin_age * 0.01
  159.             if !is_pos[array_index] {Qpos++; is_pos[array_index] = true;}
  160.             second[array_index] = second[prev_index] + time_to_pos;
  161.             M += uint64(float64(Coin)*sReward);
  162. //          fmt.Println("PoS: ", sReward, "time = ", time_to_pos, "ind", array_index)
  163.             msReward += sReward;
  164.             ysReward += sReward
  165.         }
  166.  
  167.         if (1 * block % year_blocks) == 0 {
  168.             fmt.Println("money =", M / Coin, ",", M % Coin, "\t year#", block / year_blocks)
  169.             fmt.Println("month pos:", msReward, " year pos:", ysReward, "month pow:", mwReward, " year pow:", ywReward)
  170.             fmt.Println("current_pow: ", current_pow_power, " delta time:", delta_time, " real time:", block*second_in_block, " system time:", global_system_time)
  171.             fmt.Println("target pos=", pos_target, " pow=", pow_target, " max=",max_target, " mat o;idanie:", p0)
  172.             fmt.Println("==========================================================")
  173.         }
  174.         if (block % year_blocks) == 0{
  175.             ywReward = 0
  176.             ysReward = 0
  177.         }
  178.         if (12 * block % year_blocks) == 0{
  179.             mwReward = 0
  180.             msReward = 0
  181.         }
  182.     }
  183.            
  184.     os.Exit(0)
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement