最近Vitalik提出以太坊要改POS,之前似乎业内也达成共识POS是可以替代POW的。所以认真啃了一遍PPC的源代码。

2年之前,我针对POS写过一篇文章,抽象地谈论了POS不会那么神奇:从1983年提出数字货币理论,到2009年中本聪真正实现,中间跨度26年,可以认为POW是划时代的技术突破,如果POS真有那么神奇,就根本不需要等这26年了,因为POS可以说是任何人的第一直觉就能想到的解决方案。而事实上PPC的系统安全也是靠POW来实现的,POS只是一个花哨的噱头而已。

啃源代码收获,PPCPOS具体实现方法是:

1 POW blockPOS block的比例为1:12,即每一个POW区块之后最多可以连续有12POS区块。

2 POS区块没有新矿,只有利息。

3 POS计息,起始计息时间30天(即30天不动),最长计息时间90天(即无论存多久,最多收90天的利息)。

4 POS区块也有难度要求,难度是POW标准难度/coinage币龄。(coinage是币量x储蓄天数)

5 tx里增加nTime(时间)字段,以记录tx的生成时间,用于计算利息。

6 POS区块的coinbase为空。计息txcoinbase的下一个tx,计息tx不收手续费。

7 POS区块的最后,计息 tx的收款地址要为blockheader提供一个签名

8 矿工不收手续费,手续费直接注销。

9 POW发行方式为新矿数量与难度系数的平方成反比,即难度系数越高,新矿越少。但是发行量无上限。

10 POW的难度系数完全基于POW区块计算,POS区块不参与难度系数计算。

 

下面逐条做一下解析:

1 虽然PPC引入了POS,但是却没有停掉POW,不但没有停掉,而且POW还是基石,而POS却象是花拳绣腿。这个是本文的核心话题,后面展开讨论。

2 pos区块没有新矿,改为收利息。因为这就是pos的设计目的啊,不用多说了。

3计息时限的上下限设计,是合理的。因为如果利息简单和时间成正比,不设时间上限,那么大家都不着急收利息,反正越攒越多,这样就不会有POS区块了;而另一个极端,如果不设时间下限,那么所有人就拼命发POS区块申请利息,P2P网络将被自己DOS攻击,而且领利息就完全是撞大运游戏了,越来越像POW,能耗也就高企了。30天下限,90天上限是一个合理的时间范围,每个人每个月开一次电脑,收好自己的利息下线,既不用抢block,也不用担心block过少。

4 POS区块大幅降低难度要求。按照PPC 2000万个币,平均每个POS区块5万个币收利息,x30天币龄=150万币天,所以POS的难度系数只有POW150万分之一。对应的,收到的利息是50个币,和POW的发行数量却是相当的。这就是POS节能环保的关键。

5 tx上标时间,这个是严重的画蛇添足。连block的时间都是不靠谱的,更何况tx的时间?还有,tx的时间主要是用于收利息tx,不收利息的tx也白白增加4个字节,严重浪费硬盘空间啊。而且按照时间计息的方法极度复杂,不如简单的用block数计息。看来作者相对论没学好,把时间当成绝对匀速的了。不过这个事情也无关大局,可以忽略。

6 这是一种设计吧。也无关大局,就不分析好坏了。

7 提供对blockheader的签名,目的是为了让矿工实时在线。否则只要提供一个pos tx给矿池,矿池帮忙代收就行了,这样并不能有效增加全网活跃节点数量。

提供签名我是完全认可的,但是问题是签名并没有包含在blockheader里,这就带来问题了:(1blockheader合格不能代表block合格。(2)同一个blockheader,对应的block内容可以不同(因为签名可以不同),这可锻性。。。

不多说了,这个问题不是大问题,而且也很好修复。

但是,由此带来的另一个问题却不是小问题:必须解锁钱包才可以pos挖矿,大幅压低币的安全性。即私钥要随时呆在内存里。这还了得?黑客通过P2P网络可以轻易地获得持币者的IP地址和持币量信息,然后如果持币者的电脑被大面积攻击,瞬间就会有大量的币丢失,一个币瞬间就废了。这个问题其实是无解的。要么允许预签pos tx,导致在线人数极少,POS 挖矿集中化;要么就得大幅降低整个持币人群的安全。

截止目前,pos币没有被大面积攻击,是因为pos币没有市值特别高的。如果市值达到比特币、以太币水平,估计每天都会有人丢币,最后吓的几乎没有人敢POS挖矿了,那POS也就失去意义了。

8 为什么不收手续费?PPC白皮书包装成什么用手续费通缩对抗POS利息。其实不然,因为如果收手续费,将形成抢手续费大战。逻辑是这样的:

POS之所以叫POS,就在于算力大幅低于POW(大约150万分之一)。所以,用一台个人电脑就可以随意生成pos 区块。由于每个unspent output 30天才有一次生成block的机会,所以错过pos区块并没有任何损失。所以,如果tx有手续费的话,那么pos挖矿者就会不断重发pos区块,收录更多的tx,以赚取更多的手续费。由于两个pow区块之间最多允许12pos区块,所以只要准备好12个合格的unspent output,就可以开练了。这个结果可以想象,币网络被自己DDOS攻击了,各种block满天飞。

POW矿工那边就更霸道了:直接收录上一个POW区块之后的所有tx,回滚所有的POS交易,这直接导致POS区块名存实亡,也即POS技术名存实亡。

所以,不得已,只能不收手续费。

但是,不收手续费,却是鸵鸟思维。POW矿工是不持币的,既然收录tx不收手续费,那干嘛费力不讨好地收录tx?干脆发个空block算了。而且POW矿工完全可以忽略pos block,直接基于上一个POW 区块挖矿,那不但tx没人确认,连利息都没的收了。而且,这还不是攻击呢,仅仅是矿工偷懒就会造成如此严重的后果。

很显然,这是一个重大设计缺陷,收和不收手续费都会带来严重的问题。

那这个是POS的天生残疾吗?否,非若是也。有很简单却很有效的解决方案。

9 这是一种具体设计,不需要多讨论。不过要强调的是,POW无上限,说明POW是基础,必不可少的。

10 表面上看是因为POS区块难度系数太小,实际上是因为POS区块根本无足轻重,在涉及币的安全问题难度系数上,根本没有发言权。

基于以上分析,我们发现,pos并非宣传的那么美妙,实际上只是玩了一个数学游戏,把利息通胀偷换概念为新矿(待会解释),让表观POW新矿占比下降,貌似节能而已。

而真正的POW能耗原理是这样的:

算力代表币的安全性。算力付出电费,要有对应的收入。这个收入就是新矿。同样市值的币,新矿越多,算力就越大,就越安全。

所以,不管POS利息给多高,真正决定安全的还是POW新矿数量。POW新矿少了,就是不安全。因而即便有POSPOW也少不得,那就连噱头都不算了,而是画蛇添足,添乱了。

POS带来的好处是在线节点数的增加,但是也造成了币的不安全,按照损失>收益原则,这个设计是不划算的。

 

那,POS就完全没意义吗?不是的。

以上所有讨论,都基于一个从未被人质疑过的假设:POS=领利息。

有任何理论必然性吗?否。

领利息只是POS的一种实现方式而已,然后经过以上论证我们发现这不是一个好的方式。

那么,更好的方式是?

既然POS的设定目标是节省POW算力,那就直奔目标省算力呗。

再具体一点,就是用POS签名来替代POW算力。

我们先取一个极端,如果一个block51%的持币量签名,大家是否可以完全信任这个block

当然没问题啦!持有51%的币可比持有51%的算力靠谱多了!。

好,那么按照这个比例,51%的币POS=100%POW(注,此处POS只是提供签名,不是收利息喽),挖矿时提供持币签名就对等比例的少付出算力,就是很完美的省算力方案啊。(解释:提供51%的币的签名,就可以拿走一个block的新矿,pos依然有收益,但是不是另外提供的利息,而是从固定数量的POW里面和算力争抢)

如果是这种机制,要对一个币发起攻击,还是要拿出51%的算力,一点钱都不能省。但是持币者却多了个反击工具:集中51%的币,就可以抵挡回去!

是否可能演绎成每个区块都是pow+pos,然后又变成没有意义数字游戏了?不会的。因为pos签名不是白提供的,肯定要拿到回报,这个回报是通过市场机制而非源代码hard-coded死的,即持币者向矿池提供签名,然后矿池把挖矿收益的一部分提供给持币者。这样算力拿到的钱就少了,就节能环保了。对于持币者来说,这部分收益可以理解为利息,也可以不理解为利息,因为这种收益是有成本的,成本是币安全性的下降。由于收益是市场化的,这个收益最终会和成本相挂钩,而且会有市场波动。例如,有大量币被盗时,收益率就极高;而出了一个全新的钱包技术,收益率就大幅下降。

同样两个币,同样的市值、新矿增量,一个纯POW,一个POW+POS(再次强调,此POS非领利息的pos),我们会发现难度系数最终会一样,因为单位算力的回报是一样的。但是实际付出的算力,带POS的币会少一些,少的那部分是POS收益。对应的就是环保节能。

POS会节约多少算力,需要数学上做认真的论证,键人暂时没有做深入的推理。直觉上很难超过50%。但是不管怎样,能省一块煤,天就会更蓝一点。

再回到以太坊的话题,反正要硬分叉,反正Vitalik有绝对影响力,与其增加一个复杂的POS技术,还不如直接减少POW数量来得更直接有效。

 

附:名词翻译

Block:区块

Txtransaction 交易

POW 工作量证明

POS 持币证明

PPC peercoin,点点币

Unspent output:未花费输出,其实是未花费收入

Blockheader:区块头信息。

CoinbasePOW发放新矿的tx。可以翻译为币库。

Coinage:币龄。

 

Hard-coded:硬编码