Proof-of-Stake

在 PoS 中,Net Stake Weight 是如何計算的

  • July 3, 2019

在 PoS 幣中,有一個常見的“質押時間”估計,這是基於使用者自己的累積質押量佔全網質押權重的比例。

然而,任何節點都無法可靠地估計網路權益權重,理論上它只是將所有節點的單獨權重加在一起,但由於沒有一個節點可以保證看到所有其他節點而不重複,我想了解這是如何計算的。

雖然我不知道其他 PoS 區塊鍊是如何運作的,但我可以根據 Peercoin 的 PoS 實現對 PoSv2/3 版本的一些見解;Novacoin就是一個這樣的例子。

總網路權重由這個函式計算:

double GetPoSKernelPS()
{
   int nPoSInterval = 72;
   double dStakeKernelsTriedAvg = 0;
   int nStakesHandled = 0, nStakesTime = 0;

   CBlockIndex* pindex = pindexBest;;
   CBlockIndex* pindexPrevStake = NULL;

   while (pindex && nStakesHandled < nPoSInterval)
   {
       if (pindex->IsProofOfStake())
       {
           dStakeKernelsTriedAvg += GetDifficulty(pindex) * 4294967296.0;
           nStakesTime += pindexPrevStake ? (pindexPrevStake->nTime - pindex->nTime) : 0;
           pindexPrevStake = pindex;
           nStakesHandled++;
       }

       pindex = pindex->pprev;
   }

   if (!nStakesHandled)
       return 0;

   return dStakeKernelsTriedAvg / nStakesTime;
}

權重估計算法的工作原理非常有趣:它在區塊鏈中向後迭代,從最新的已知最佳區塊開始,直到找到使用權益證明產生的 72 個區塊(基本上是過去的所有 72 個區塊)。

使用這 72 個 PoS 塊,它計算每個連續塊對之間經過的總時間量(加起來總計 – nStakesTime)以及在這些塊的生產過程中滿足的“難度”總量(dStakeKernelsTriedAvg)。

最終的網路權重估計是通過將“工作量”除以“時間量”來給出的。

該算法不會嘗試計算在任何給定時間“處於危險之中”的硬幣的確切數量,因為正如您所注意到的那樣,這是不可能的;然而它給出的估計是相當準確的。

引用自:https://bitcoin.stackexchange.com/questions/76870