PoS,即股份的证明,译为权益证明。
无论战俘或PoS,均可以理解为“谁有资格写区块链”的问题。
战俘通过算力证明自己有资格写区块链,而PoS则是通过拥有的币龄来证明自己有资格写区块链。
战俘的优势和弊端
战俘,优势为可靠,使用广泛,是经历了充分的实践检验的公有链共识算法。
但其缺点也较为明显:
1,消耗了太多额外算力,即大量能源。
2,资本大量投资矿机,导致算力中心化,有51% * * *的安全隐患。
PoS的提出和点点币
第一个基于PoS的虚拟币是点点币。
鉴于战俘的缺陷,2012年阳光灿烂的国王提出了PoS,并基于战俘和PoS的混合机制发布了点点币PPCoin。
前期采用战俘挖矿开采和分配货币,以保证公平。后期采用PoS机制,保障网络安全,即拥有51%货币难度更大,从而防止* * * 51%。
PoS核心概念为币龄,即持有货币的时间,例如有10个币,持有90天,即拥有900币天的币龄。
另外使用币,即意味着币龄的销毁。
在PoS中有一种特殊的交易称为利息币,即持有人可以消耗币龄获得利息,同时获得为网络产生区块,以及PoS造币的优先权。
点点币的PoS实现原理
点点币的PoS证明计算公式为:
proofhash & lt;币龄x目标值
展开如下:
哈希(nStakeModifier + txPrev.block。nTime + txPrev。抵消+ txPrev。nTime + txPrev.vout。n + nTime) & lt;bnTarget x bnCoinDayWeight
其中proofhash,对应一组数据的哈希值,即哈希(nStakeModifier + txPrev.block。nTime + txPrev。抵消+ txPrev。nTime + txPrev.vout。n + nTime)。
币龄即bnCoinDayWeight,即币天,即持有的币数乘以持有币的天数,此处天数最大值为90天。
目标值,即bnTarget,用于衡量PoS挖矿难度。目标值与难度成反比,目标值越大,难度越小,反之亦然。
由公式可见,持有的币天越大,挖到区块的机会越大。
peercoin-0.6.1ppc中PoS证明计算代码如下:
<代码> bool CheckStakeKernelHash (unsigned int nBits const CBlockHeader&unsigned int nTxPrevOffset blockFrom, const CTransaction&txPrev const COutPoint&prevout, unsigned int nTimeTx uint256&bool fPrintProofOfStake hashProofOfStake) { 如果(nTimeTx & lt;txPrev.nTime)//事务时间戳违反 返回错误(“CheckStakeKernelHash (): nTime违反”); unsigned int nTimeBlockFrom=blockFrom.GetBlockTime (); 如果(nTimeBlockFrom + nStakeMinAge祝辞nTimeTx)//分钟年龄要求 返回错误(“CheckStakeKernelHash():最小年龄违反”);//目标值使用nBits CBigNum bnTargetPerCoinDay; bnTargetPerCoinDay.SetCompact (nBits); int64 nValueIn=txPrev.vout [prevout.n] .nValue;//v0.3协议内核散列重量在30天的最小年龄从0开始//这种改变增加积极的硬币参与哈希和帮助//安全网络当proof-of-stake难度很低 int64 nTimeWeight=min ((int64) nTimeTx - txPrev。nTime (int64) STAKE_MAX_AGE) - (IsProtocolV03 (nTimeTx) ?nStakeMinAge: 0);//计算币龄,STAKE_MAX_AGE为90天 CBigNum bnCoinDayWeight=CBigNum (nValueIn) * nTimeWeight/硬币/(24 * 60 * 60);//计算散列 CDataStream ss (SER_GETHASH 0);//权重修正因子 uint64 nStakeModifier=0; int nStakeModifierHeight=0; int64 nStakeModifierTime=0; 如果(IsProtocolV03 (nTimeTx))//v0.3协议 { 如果(! GetKernelStakeModifier (blockFrom.GetHash (), nTimeTx, nStakeModifier, nStakeModifierHeight, nStakeModifierTime, fPrintProofOfStake)) 返回错误; 党卫军& lt; & lt;nStakeModifier; }//其他v0.2协议 { 党卫军& lt; & lt;nBits; }//计算proofhash//即计算哈希(nStakeModifier + txPrev.block。nTime + txPrev。抵消+ txPrev。nTime + txPrev.vout。n + nTime) 党卫军& lt; & lt;nTimeBlockFrom & lt; & lt;nTxPrevOffset & lt; & lt;txPrev。nTime & lt; & lt;prevout。n & lt; & lt;nTimeTx; hashProofOfStake=散列(ss.begin (), ss.end ()); 如果(fPrintProofOfStake) { 如果(IsProtocolV03 (nTimeTx)) printf (" CheckStakeKernelHash():使用修饰符0 x % 016”PRI64x”高度=% d timestamp=% s的块高度=% d timestamp=% s \ n”, nStakeModifier nStakeModifierHeight, DateTimeStrFormat (nStakeModifierTime) .c_str (), mapBlockIndex [blockFrom.GetHash ()]→nHeight, DateTimeStrFormat (blockFrom.GetBlockTime ()) .c_str ()); printf (" CheckStakeKernelHash():检查协议=% s修饰符=0 x % 016”PRI64x“nTimeBlockFrom=% u nTxPrevOffset=% u nTimeTxPrev=% u nPrevout=% u nTimeTx=% u hashProof=% s \ n ", IsProtocolV05 (nTimeTx) ?“0.5”:(IsProtocolV03 (nTimeTx) ?“0.3”,“0.2”), IsProtocolV03 (nTimeTx) ?nBits nStakeModifier:(uint64), nTimeBlockFrom、nTxPrevOffset txPrev。nTime prevout。n, nTimeTx, .c_str hashProofOfStake.ToString () ()); }//现在检查proof-of-stake散列是否满足目标协议//判断是否满足proofhash & lt;币龄x目标值 如果(CBigNum (hashProofOfStake)比;bnCoinDayWeight * bnTargetPerCoinDay) 返回错误; 如果(fDebug,,! fPrintProofOfStake) { 如果(IsProtocolV03 (nTimeTx)) printf (" CheckStakeKernelHash():使用修饰符0 x % 016”PRI64x”高度=% d timestamp=% s的块高度=% d timestamp=% s \ n”, nStakeModifier nStakeModifierHeight, DateTimeStrFormat (nStakeModifierTime) .c_str (), mapBlockIndex [blockFrom.GetHash ()]→nHeight, DateTimeStrFormat (blockFrom.GetBlockTime ()) .c_str ()); printf (" CheckStakeKernelHash():通过协议=% s修饰符=0 x % 016”PRI64x“nTimeBlockFrom=% u nTxPrevOffset=% u nTimeTxPrev=% u nPrevout=% u nTimeTx=% u hashProof=% s \ n ", IsProtocolV03 (nTimeTx) ?“0.3”,“0.2”, IsProtocolV03 (nTimeTx) ?nBits nStakeModifier:(uint64), nTimeBlockFrom、nTxPrevOffset txPrev。nTime prevout。n, nTimeTx, .c_str hashProofOfStake.ToString () ()); } 返回true; }//代码位置src/kernel.cppPoS权益证明算法原理及其在点点币,黑币中的实现