PoS权益证明算法原理及其在点点币,黑币中的实现

  

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.cpp 

PoS权益证明算法原理及其在点点币,黑币中的实现