<>POS & POW 混合共识

点点币PPCoin、新星币NovaCoin、雅币YaCoin、比特存储、黑币早期都采用POW+POS结合的模式。

点点币PPCoin首次实现POS(年利率1%)
新星币NVC助力POS(年利率5%)
雅币YaCoin(年利率5%)

新星币:https://github.com/novacoin-project/novacoin
<https://github.com/novacoin-project/novacoin>
黑币:https://github.com/CoinBlack/blackcoin
<https://github.com/CoinBlack/blackcoin>
比特存储:https://github.com/UnitedBitcoin/UnitedBitcoin
<https://github.com/UnitedBitcoin/UnitedBitcoin>

业内提出了PoS(Proof of Stake)的思想:

* 把生产block的工作交给拥有更多token的人,拥有的越多,作为block producer的概率越高
* 生产block的过程中得到token奖励,可以理解为持有token带来的利息
* 拥有大量token的人如果攻击网络,则会造成token价格的下降,对这些人是不利的,所以这些block producer攻击网络的意愿较低
* 生产block只需证明自己持有的token即可,不需要消耗多少算力,节约能源
围绕以上PoS的思想,各个区块链系统有不同的PoS实现,以下将依次介绍。

<>Peercoin PoS v1

最初的一版PoS由Peercoin设计实现[8]。其中,用户要产出block必须满足以下条件:
hash(stake_modifier, current_time, UTXO) < coin(UTXO) * age(UTXO) * difficulty
具体解释如下:

*
用户在每一秒时间(current_time),遍历自己所有的UTXO,代入上述公式中,看是否能满足不等式条件;如果满足,就把相应的UTXO记录在block中,并发布block(见4)
* stake_modifier是对前一个block中部分字段hash后的值,加入这一项是为了防止用户提前预知自己何时有权挖矿
* difficulty会根据近期的block产出时间动态调整,保证block产出时间间隔稳定
* 由于每秒只需要完成和自己UTXO数量相等的hash计算,所以需要的算力较低
*
从不等式可以看出,持有的UTXO越多、UTXO中token数额越大(coin(UTXO))、UTXO持有时间越长(age(UTXO),或称之为币龄),不等式越容易成立,越容易进行挖矿
* 生成block的奖励设置为了coin(UTXO) * age(UTXO),即UTXO数额越大持有时间越长,奖励越高
*
为了将符合条件的UTXO记录进block,并且兼容原本的PoW模式,Peercoin设计了coinstake的逻辑:保留原本第一个transaction为coinbase,但要求输入数量必须等于1,且输入的prev.out字段必须置空值,输出数量必须大于等于1;令第二个transaction为coinstake,要求输入数量大于等于1,且第一个输入为满足条件的UTXO,输出数量大于等于2,且第一个输出必须置空值,第二个输出为block奖励。
币基结构图:


该版本的PoS面临着如下的问题:

*
因为构造新的block没有算力成本,所以当区块链出现fork的时候,用户有可能会倾向于同时在多个branch一起挖矿来获得潜在更高的收益,这样制造了大量的分支,破坏了一致性。这个问题多次被以太坊团队提及,并称之为nothing
at stake问题,以太坊在其PoS方案CASPER中致力于解决该问题
* 出现了攒币龄的现象,即关闭节点,直到age(UTXO)足够大的时候再启动节点挖矿,从而节省电力,这样引起了在线节点数太少系统脆弱的问题
* 可以攒够足够的币龄后,保证自己有足够的UTXO能够连续生产block,从而发动double-spend攻击
<>Blackcoin PoS v2

Blackcoin在Peercoin的基础上进行了修改,从而缓解了上述问题,主要改动如下:

*
去掉了不等式公式右边的age(UTXO),从而解决了问题3中攒币龄然后进行double-spend的现象;但是block奖励还是使用了币龄,因此并不能完全解决问题2中节点关闭的现象。
* 优化了stake_modifier的计算逻辑,让用户提前预知自己有权挖矿时间的难度更大了。
<>Blackcoin & Qtum PoS v3

Blackcoin又在v2的基础上改进得到了v3,然后Qtum对v3又进行了修改并应用。主要改动点描述如下:

* 把block奖励改成固定值,解决了问题2
* 规定500个block之前的UTXO才能参与挖矿,缓解挖矿过于频繁带来的潜在风险
<>代码流程图

<>Blackcoin 黑币 POS 流程
ThreadStakeMinerminermainwalletkernelCreateNewBlockGetNextTargetRequired
SignBlockCreateCoinStakeSelectCoinsForStakingCheckKernelCheckStakeKernelHash
CheckStakeCheckProofOfStakeIsConfirmedInNPrevBlocksProcessBlockCheckBlock
AcceptBlockThreadStakeMinerminermainwalletkernel
<>UBTC 比特存储 POS 流程
ThreadStakeMinerminerPoWCWalletCreateNewBlockPosComputeBlockVersion
GetAdjustedTimeGetNextWorkRequiredPosGetNextTargetRequiredCreate coinbaseCreate
coin stakeSelectCoinsForStakingCheckKernelCheckProofOfStakeTestBlockValidity
CheckStakeProcessNewBlockThreadStakeMinerminerPoWCWallet