public double GetPoSKernelPS() { int nPoSInterval = 72; double dStakeKernelsTriedAvg = 0; int nStakesHandled = 0, nStakesTime = 0; ChainedBlock pindex = this.ChainIndex.Tip; ChainedBlock pindexPrevStake = null; while (pindex != null && nStakesHandled < nPoSInterval) { // todo: verify this does not require to be set by the block if (pindex.Header.PosParameters.IsProofOfStake()) { if (pindexPrevStake != null) { dStakeKernelsTriedAvg += this.GetDifficulty(pindexPrevStake) * 4294967296.0; nStakesTime += (int)pindexPrevStake.Header.Time - (int)pindex.Header.Time; nStakesHandled++; } pindexPrevStake = pindex; } pindex = pindex.Previous; } double result = 0; if (nStakesTime > 0) { result = dStakeKernelsTriedAvg / nStakesTime; } if (BlockValidator.IsProtocolV2(this.ChainIndex.Height)) { result *= BlockValidator.STAKE_TIMESTAMP_MASK + 1; } return(result); }