SHOW:
|
|
- or go back to the newest paste.
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 | - | var block = 0//block count ( for genesis block = 0 ) |
14 | + | |
15 | ||
16 | //var percent = 0.00000011946 | |
17 | var pi = math.Pi;// float64(3.1415926535897932384626433832795) | |
18 | - | var pi = float64(3.1415926535897932384626433832795) |
18 | + | var coef10 = float64(10)/math.Log(10) |
19 | - | var coef = float64(0.43429448190325182765112891891661) |
19 | + | var year = 365.25 |
20 | - | var year = 262980 |
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_year = 0.0314159 |
23 | + | var percent_block = (percent_day_multi - 1) / 720.0 |
24 | - | var percent_day_multi = math.Pow(1+percent_year, float64(1.0/365.0)) |
24 | + | var second_in_block = 2 * 60 |
25 | - | var percent = (percent_day_multi - 1) / 720.0 |
25 | + | |
26 | var powp4 = 20.0 | |
27 | var powp3 = 0.0 | |
28 | - | var Coin = int64(1000000) |
28 | + | // *= 1 + pow4 / (X + pow3) - year pow multi |
29 | - | var Cent = int64(10000) |
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 fees = 0.0 |
37 | + | var max_target = uint64(0x00ffffffffffffff) |
38 | var pow_target = max_target | |
39 | - | var wHour = 29//PoW blocks' rate per 1 hour |
39 | + | var pos_target = max_target |
40 | - | var shour = 1// PoS blocks' rate per 1 hour |
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 | - | //years to mine in blocks |
48 | + | |
49 | - | eot := year * int(fl) + 2 |
49 | + | |
50 | - | // fmt.Println(eot) |
50 | + | var M = uint64(supply) |
51 | - | // os.Exit(0) |
51 | + | |
52 | - | rnd := rand.New(rand.NewSource(7998884776666255876)) |
52 | + | var second [5040]uint64 |
53 | - | for { |
53 | + | var is_pos [5040]bool |
54 | - | if block < 10000000 { |
54 | + | var array_index = uint(0); |
55 | - | wReward = 10.0 + coef * math.Log(wDiff) |
55 | + | var prev_index = uint(0); |
56 | - | // fmt.Println("PoW bounty: ", wReward, "wDiff=", wDiff) |
56 | + | var Qpos = 0; |
57 | - | if block > 10 { wDiff = (1.005 * wDiff + rnd.Float64() * 111111.0 + 1.0) / 2 } |
57 | + | var p_pos = 0.25; |
58 | - | if wDiff > 64000.0 { wDiff = 63999.0 } |
58 | + | |
59 | - | block++ |
59 | + | |
60 | flag.Parse() | |
61 | - | // if block >= 1000000 { wReward = 0.0 } |
61 | + | |
62 | - | txFees := rnd.Float64() / 1.35 |
62 | + | eot := year_blocks * int(fl) + 1 |
63 | - | if txFees > 0.66 { txFees = 0.02 } |
63 | + | |
64 | - | coinAge := rnd.Int63n(89970) + 30 //pseudorandom coin_age in days |
64 | + | sReward := 0.0 |
65 | - | sReward := float64((33 * coinAge) / 12053) * 0.01 |
65 | + | mwReward := 0.0; |
66 | - | // fmt.Println("PoS: ", sReward, "Fees=", txFees) |
66 | + | msReward := 0.0 |
67 | - | // sRewardAndFees := sReward + txFees |
67 | + | ywReward := 0.0; |
68 | - | block++ |
68 | + | ysReward := 0.0 |
69 | - | // fmt.Println("") |
69 | + | for i:= 0; i<5040; i++{ |
70 | - | supply = supply + wReward + sReward |
70 | + | second[i]=0; |
71 | - | fees = fees + txFees |
71 | + | is_pos[i]=false; |
72 | - | if (block % year) == 0 { |
72 | + | |
73 | - | fmt.Println("moneysupply: ", strconv.FormatFloat(supply, 'f' , -1, 64), " at block #", block) |
73 | + | second[0]=1; |
74 | - | fmt.Println("tx_fees =", fees) |
74 | + | fmt.Println("PoS: Fees=", eot) |
75 | - | fmt.Println("PoW bounty: ", wReward, "wDiff=", wDiff) |
75 | + | //years to mine in blocks |
76 | - | fmt.Println("PoS: ", sReward, "Fees=", txFees) |
76 | + | // fmt.Println(eot) |
77 | // os.Exit(0) | |
78 | rnd := rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) | |
79 | - | if block > eot { break } |
79 | + | current_pow_power := ideal_pow_power; |
80 | for block := 0; block < eot; block++ { | |
81 | - | |
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 | } |