《Analysis of Bitcoin Pooled Mining Reward Systems》

| 分类 论文笔记  | 标签 矿池协议  矿池攻击 

矿池

相对于单独挖矿而言,集体挖矿虽然不能改变收益的期望值,但是可以显著的减小收益的方差。矿池管理员通过收取固定百分比费用向矿工提供服务,剩余的奖励按照矿工的贡献来进行结算,本文主要就是讲不同的结算方法的差异。

矿池协议


直观的实现

1 按百分比 (Proportional)

这个协议按轮来进行结算,一轮指的是从一个块被发现到下一个块被发现为止。按百分比就是根据矿工提交的shares数占总数的百分比来进行结算。

这种简单的方式存在一种pool-hopping策略,pool-hopping是指矿工可以通过选择挖矿的时机来获得比持续挖矿的诚实用户获得更多的回报。一个很直观的感觉是由于结算是按照提交的shares占的百分比来算的,如果一轮提交的shares数越多,每个shares的价值就越小,也就是说随着shares提交的越来越多每个shares的价值就越来越小。另外,何时能找到正确的值是完全随机的,也就是说先提交的shares可能立马就找到的正确的值而价值高,而后提交的shares即使立即找到的正确值也必定价值低。这个先后的数量分界点为难度的43.5%。

2 Pay-per-share (PPS)

在这种协议中,矿池operator对于矿工的每一个share都立刻支付固定的费用,这样就可以将矿工的方差降为0,也不存在pool-hopping的情况。但是operator就要承担所有的风险,它的方差和单独挖矿的hashrate成指数次增长,operator要维持一定的收支平衡就必须收取高额的交易费,这对矿工来说又产生了一定的缺陷,但是要想获得稳定的收入就必须得付出相应的代价。


积分机制

3 Slush’s Method

这种方法是基于百分比方法的,但是为了避免pool-hopping,增加新的机制——对于矿工提交的每个share进行积分,最后在一轮的最后按照每个矿工的分数来结算。而每个share的分数是一个一轮开始时间的指数函数score = exp(T/C),C是一个常数,表示增长速率,T是时间。也就是说随着时间越来越长每个share的分数就越来越高。

但是这种方法并没有改变百分比方法的本质——share数量少的一轮每个share的价值依然高,积分只是减弱了pool-hopping的影响,但并没有完全消除。另外还受到hashrate波动和系统难度调整的影响。

4 几何法 (Geometric method)

几何法和slush方法有些类似,也是通过积分的方式并且每个share的分数也是递增的,但是却解决了slush中的问题,能够完全抵抗pool-hopping。几何法采用了两种收费方式,一个固定的费用和一个可变的费用,算法的运行过程如下

  1. 选择参数f和c
  2. 在每一轮开始时令s = 1,对于每个矿工k,Sk表示矿工这一轮的总分数,并且令Sk = 0
  3. 令r = 1-p+p/c,p=1/D,D表示当前的难度,如果D发生改变那么r也相应的变
  4. 当矿工k提交了一个share,Sk = Sk + spB,B是每个Block的奖励,然后令s = sr
  5. 如果当前的share就是最终的解,这一轮结束。给每个矿工k支付(1-f)(r-1)Sk / (sp)

其中,f是固定费用比,c是可变费用平均值,operator最终收取的费用的均值为(c+f-cf)B。s记录着每个share应当奖励的分数,并且成指数次增长,这就导致了先提交的share最终价值逐渐衰减,其中r就是衰减速率。当B和D固定的时候,可以计算出每个share价值的期望值也是固定的,为(1-f)(1-c)pB,这就说明了无论何时提交share也就是即使运用pool-hopping策略收益的期望值都是一样的。另外,由于s是成指数次增长的,所以必然很快就会溢出,这可以周期性的令Sk = Sk / s,且令s = 1,因为我们关心的是Sk和s的比值,而并不关心它们的实际值究竟是多少。

5 Pay-per-last-N-shares (PPLNS)

PPLNS抛弃了原来的“轮”的概念,而是只计算找到解之前最后提交的N个share(参考 What is PPLNS),而每一轮需要的share数是不确定的,有些大于N,那么就必然要舍弃一些;有些小于N,那么有些share就必须重复计算;而若需要的share数刚好等于N,则跟前面的百分比方法一样。既然没有了“轮”,那么也就不存在在一轮的开始或者结尾提交share的情况了,也就不存在pool-hopping了。这样对于每个share的期望回报是(1-f)pB,方差为pB^2 / N,方差变为原来的N分之一。

unit-PPLNS留坑,暂时还没看懂= =


改进pay-per-share

由于pay-per-share是由operator立即支付给矿工酬劳,所以管理员自身需要承担很大的风险,下面几种方法主要就是几种优化从而避免这些风险。

6 Maximum pay-per-share (MPPS)

在这种方法中,保存两个余额,一个PPS余额,另一个proportional余额,最后取小的一个。就是说当矿工提交一个share的时候,按照PPS协议中的规则增加PPS余额,当矿池找了答案之后,按照proportional方法中的规则增加proportional余额,最后给矿工的奖励是两个余额中较小的那个。

这种方法也存在很明显的缺陷。首先,由于原来的两种方法中矿工的期望收益都相当并且等于正常值,但是两者取小之后就必然小于正常值。假设矿工持续挖矿直到挖出n个block,那么这种方法相对于其他协议将会亏损$\frac{1}{\sqrt{2{\pi}n}}$。并且还无法防御pool-hopping。

7 Shared maximum pay-per-share (SMPPS)

这种方法是在PPS的基础上加了一点变化。由矿池维护一个共有变量R,表示矿池通过挖矿的收益和应付给矿工的酬劳的差。当R>0,表示矿池支付完矿工的酬劳之后还有R比特币剩余,如果之后由shares被提交过来,那么operator将立即使用剩余的比特币进行支付;当R<0,也就是说当前operator还欠费,当新的block被解出来得到的奖励将被立即用来偿还欠下的债,也就是说如果一个矿工原先被欠了w个BTC,那么应该偿还wB / (-R)个BTC。

这个方法也存在几个问题。首先,当R<0时,矿工的奖励将会被延迟,因为下一个block的奖励优先用来还债,这就会导致最终矿工奖励的时间一直往后拖延,operator欠下的债越来越多,从而最终崩溃。并且这种方法也存在pool-hopping。

8 Equalized SMPPS (ESMPPS)

这个和SMPPS基本类似,但是ESMPPS会记录每一个share对应应付多少钱,然后在R<0时优先支付价值小的share,就使得新的share能够相对较快的被支付。


高级方法

9 Double geometric method

这种方法是将geometric method和PPLNS进行了折中,算法运行如下

  1. 当矿池第一次运行的时候,初始化s=1,对于每个矿工k,Sk表示矿工当前的总分数,并且令Sk=0
  2. 令r=1+p(1-c)(1-o)/c,在任何时刻如果难度改变或者参数发生改变,r也相应的重新计算
  3. 当矿工k提交了一个share,令Sk=Sk+(1-f)(1-c)spB,且s=sr
  4. 如果当前share就是答案,那么对于每一个矿工支付(1-o)Sk/(cs),然后令Sk=Sk*o

矿池攻击

1 Pool-hopping

这种攻击是指矿工选择有利时机进行挖矿,而在不利时期就离开或者还其他矿池进行挖矿。所以前提是矿工能够根据当前时刻判断是否是有利时期。

2 Block withholding

这个攻击意思是矿工解出了一个block但是不提交给operator,而是自己保留,又分为两种情况。

Sabotage

意思是蓄意破坏,就是找到解之后永远都不提交,这样对于矿池和矿工来说都会减少它们的收益,但是对攻击者来说没有任何利益。

Lie in wait

这个是找到block之后延迟一段时间提交,从而获取更多的利益。具体一种实现方式是先讲算力平均分布到各个矿池,找出其中某一个矿池的解之后,再将所有算力集中到那一个矿池,一段时间后再提交解。这也有一定的风险,因为有可能在等待的这段时间里其他矿池的矿工找出了解,那么它的这个块就是无效的,也就损失原本应得的利益。但是从统计的角度讲,还是会获利。

Block withholding 解决方案

第一种方法是由矿池周期性的向矿工提出一个已知答案的问题,然后标记那些没有提交答案的矿工,但是这个难以实现。第二个方法就是让矿工无法验证当前的share是否是最终的解,一种可能的方式如下:

  • 每个Block额外添加三个字段——SecretSeed,ExtraHash和SecretHash
  • ExtraHash是SecretSeed的哈希值
  • ExtraHash是block header的一部分,所以也是最终计算BlockHash的一部分
  • SecretHash是hash(BlockHash + SecretSeed)
  • 原来一个有效的block需要满足BlockHash小于$\frac{2^{256}}{2^{32}D}$,而现在一个有效的block需要满足BlockHash小于$\frac{2^{256}}{2^{32}}$并且SecretHash小于$\frac{2^{256}}{D}$

上一篇     下一篇