Esempio n. 1
0
        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);
        }