View difference between Paste ID: REZUfBQ1 and K2etKtiR
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
}