forked from gridcoin-community/Gridcoin-Research
-
Notifications
You must be signed in to change notification settings - Fork 0
/
stake-miner.txt
138 lines (112 loc) · 5.44 KB
/
stake-miner.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
Stake Miner
===========
Job of the StakeMiner is to search for valid kernel and create new blocks.
It received considerable development attention lately, lot was changed to a
point you may notice a difference in behavior. Let me describe how it works.
## Stake weight
In ~dev~ ~staging~ master branch, the stake weight is reported in two places on
the overview screen.
The "DPOR Weight:" is calculated somewhere in gui code as balance+magnitude and
**may not reflect real staking weight**.
Second is in "Client message:" is calculated in stake miner as sum of weights
of all mature UTXOs and reflects the **real weight**. It is **not in coin**
units.
* For version 7 blocks, 1 GRC and 0 Mag equals to 800 of weight.
* For version **8** blocks 1 GRC equals to 80 of weight.
## Command getmininginfo
RPC command (also in debug console) can be used to obtain additional
information from StakeMiner.
* `stakeweight.combined`; no unit natural;
Sum of stake weights of all your mature UTXOs.
This is your total, real stake weight.
The minimum and maximum if then min/max of them.
* `stakeweight.valuesum`; GRC real;
Total balance that is mature and considered for staking.
* `stakeweight.legacy`; GRC real;
Calculation of the above, done in different code.
* `staking`; bool; Indication that the stake miner is doing it's job.
* `mining-error`; test; Reason why stake miner is not doing it's job.
* `mining-message`; text;
various message by miner, previously contained in `MiningInfo 5`.
* `time-to-stake_days`; days real; Estimated time to stake.
* `expectedtime`; seconds natural; Estimated time to stake.
* `mining-version`; integer; Version of block the miner will create.
* `mining-kernels-found`; count natural; Count of CoinStake kernels found.
You can figure out how many blocks were aborted or rejected by subtracting.
* `mining-created`; count natural; Count of blocks fully created.
* `mining-accepted`; count natural; Count of blocks locally accepted.
They might still get rejected by network. Too many locally rejected blocks
usually mean a problem. But v7 blocks usually are rejected for reward too low.
* `InterestPending` GRC real;
Sum of interest currently owed on all UTXOs.
When you stake, you usually get only part of this.
When you send coins, the interest is destroyed.
* `BoincRewardPending`; GRC real;
The amount one would receive for research if he were to stake at that moment.
* `difficulty.proof-of-stake`; no unit real; Current staking difficulty.
Higher number means more secure and healthier network,
but it is less probable to stake.
This number is perfect for network health monitoring.
* `netstakeweight`; GRC natural;
Estimated weight of the network.
I wouldn't make any conclusions based on this value.
* `netstakeweight2`; GRC natural; Different function calculating network weight.
* `difficulty.search-interval`; millisecond natural;
How long miners sleeps between attempts.
Configured using `minersleep` config option.
* `pooledtx` count natural; Number of unconfirmed transactions in mempool.
* `stakeinterest`; micro percent APR natural; Current interest rate.
* `CPID`; hex; Your mining CPID or investor.
* `Magnitude Unit`; real; Current magnitude unit.
## Code flow description
It runs in a loop in it's own thread. The loop is composed of several
commands as illustrated below. If any of the commands fails, the loop
starts over.
```
while not shutdown do begin {
Sleep( minersleep );
IsMiningAllowed
CreateCoinStake;
CreateRestOfTheBlock
AddGridcoinReward
SignStakeBlock
ProcessBlocks
end
```
### CreateCoinStake
This function loops over all own unspent transaction outputs (UTXOs)
and for each it checks validity of the stake kernel. When a tx
meeting all stake conditions and the stake meets the difficulty
target, the search is stopped and miner proceeds to actually create
the CoinStake block, otherwise the miner loop starts over.
A stake time-stamp mask is applied to current time-stamp before it is
used in the kernel. This mask is 16 seconds. During this 16 second
period, the outcome of stake kernel evaluation for given UTXO does not
change. It is either failure the whole time, or success. So **it makes
no sense to evaluate more often**. To account for processing drift and
stake modifier change caused by incoming block, Miner waits only 8
seconds before trying again.
If you enable debug2 flag, stake hash and target will be written to
log file.
This function adds a valid CoinStake transaction to second transaction
in block (first is CoinBase tx) and returns true on success.
### CreateRestOfTheBlock
If a valid stake is found, rest of the block must be created.
Most notably unconfirmed transactions (from `mempool`) are
included into the block and their fees added to reward.
This function was not modified. Previously it was called before
searching for coinstake which resulted in lot of unused blocks
being created and work wasted.
### AddGridcoinReward
Here Fees, Interest reward and Boinc rewards are calculated
and added to the block. Also `boincHash` is constructed
from the results of reward calculation and added to,
interestingly, the CoinBase transaction. CoinBase is
otherwise not used, has zero input and output.
Description of the boincHash and reward calculation can be found
in other article.
### ProcessBlocks
When the block is ready, it is passed to the same function which
processes blocks received from other peers. It takes care of
verification, adding to local block-chain and propagating to
other peers.