Proof-of-Stake
在 PoS 中,Net Stake Weight 是如何計算的
在 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
)。最終的網路權重估計是通過將“工作量”除以“時間量”來給出的。
該算法不會嘗試計算在任何給定時間“處於危險之中”的硬幣的確切數量,因為正如您所注意到的那樣,這是不可能的;然而它給出的估計是相當準確的。