forked from PascalCoinDev/PascalCoin
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added: PIP-0005 Stabalised difficulty algorithm
- Loading branch information
1 parent
76b6b42
commit 990ac1a
Showing
1 changed file
with
92 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
<pre> | ||
PIP: 5 | ||
Title: Stablised difficulty algorithm | ||
Type: Protocol | ||
Impact: Hard-Fork | ||
Author: Albert Molina <i><bpascalblockchain@gmail.com></i> | ||
Comments-URI: N/A | ||
Status: Active | ||
Created: 2017-04-01 | ||
</pre> | ||
|
||
***PIP Editor Note:** This PIP was created retrospectively based of the [Whitepaper V2][1] on 2017-08-15.** | ||
|
||
## Summary | ||
|
||
A new difficulty adjustment algorithm is proposed to stablise sinusoidal volatility resulting from chaotic hashpower fluctuations. | ||
|
||
## Motivation | ||
|
||
Due to the volatile nature of cryptocurrency valuations, miners will tend to migrate en masse based on profitability of coins. As miners migrate, blocktimes are temporarily affected as time is needed for difficulty adjustments. Cloud-mining has exacerbated this issue. Resolving this issue will result in more stable blocktime and more reliable daily supply. | ||
|
||
## Specification | ||
|
||
An enhanced the difficulty calculation algorithm to to better adjust | ||
for sinusoidal volatility is proposed as follows. | ||
|
||
|
||
```pascal | ||
function TPCSafeBox.GetActualTargetHash(UseProtocolV2 : Boolean): TRawBytes; | ||
{ Target is calculated in each block with avg obtained in previous | ||
CT_CalcNewDifficulty blocks. | ||
If Block is lower than CT_CalcNewDifficulty then is calculated | ||
with all previous blocks. | ||
} | ||
Var ts1, ts2, tsTeorical, tsReal, tsTeoricalStop, tsRealStop: Int64; | ||
CalcBack : Integer; | ||
lastBlock : TOperationBlock; | ||
begin | ||
if (BlocksCount <= 1) then begin | ||
// Important: CT_MinCompactTarget is applied for blocks 0 until ((CT_CalcNewDifficulty*2)-1) | ||
Result := TPascalCoinProtocol.TargetFromCompact(CT_MinCompactTarget); | ||
end else begin | ||
if BlocksCount > CT_CalcNewTargetBlocksAverage then CalcBack := CT_CalcNewTargetBlocksAverage | ||
else CalcBack := BlocksCount-1; | ||
lastBlock := Block(BlocksCount-1).blockchainInfo; | ||
// Calc new target! | ||
ts1 := lastBlock.timestamp; | ||
ts2 := Block(BlocksCount-CalcBack-1).blockchainInfo.timestamp; | ||
tsTeorical := (CalcBack * CT_NewLineSecondsAvg); | ||
tsReal := (ts1 - ts2); | ||
If (Not UseProtocolV2) then begin | ||
Result := TPascalCoinProtocol.GetNewTarget(tsTeorical, tsReal,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target)); | ||
end else begin | ||
CalcBack := CalcBack DIV CT_CalcNewTargetLimitChange_SPLIT; | ||
If CalcBack=0 then CalcBack := 1; | ||
ts2 := Block(BlocksCount-CalcBack-1).blockchainInfo.timestamp; | ||
tsTeoricalStop := (CalcBack * CT_NewLineSecondsAvg); | ||
tsRealStop := (ts1 - ts2); | ||
{ Protocol 2 change: | ||
Only will increase/decrease Target if (CT_CalcNewTargetBlocksAverage DIV 10) needs to increase/decrease too, othewise use | ||
current Target. | ||
This will prevent sinusoidal movement and provide more stable hashrate, computing always time from CT_CalcNewTargetBlocksAverage } | ||
If ((tsTeorical>tsReal) and (tsTeoricalStop>tsRealStop)) | ||
Or | ||
((tsTeorical<tsReal) and (tsTeoricalStop<tsRealStop)) then begin | ||
Result := TPascalCoinProtocol.GetNewTarget(tsTeorical, tsReal,TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target)); | ||
end else begin | ||
// Nothing to do! | ||
Result:=TPascalCoinProtocol.TargetFromCompact(lastBlock.compact_target); | ||
end; | ||
end; | ||
end; | ||
end; | ||
``` | ||
|
||
## Rationale | ||
|
||
Solution space for this problem is vast. Rational for proposal is "most simple" thus less likely to introduce new attack vectors. | ||
|
||
## Backwards Compatibility | ||
|
||
Proposed changes are not backwards compatible and will require a hard-fork. | ||
|
||
## Reference Implementation | ||
|
||
This PIP has been implemented in V2 by Albert Molina. | ||
|
||
## Links | ||
|
||
1. [PascalCoin White Paper V2][1] | ||
|
||
[1]: https://github.com/PascalCoin/PascalCoin/blob/master/PascalCoinWhitePaperV2.pdf |