基于打分的方法
Slush 法
Slush Pool 在比例法的基础上改造而来,主要是为了抗 pool-hopping,但实际上也没完全解决。
具体算法:每个矿工在每一轮中的每个 share 有一个分数 \(s=e^{\dfrac{t}{c}}\),越到一轮的后期,分数越大。每一轮的奖励按分数平分。
在比例法中,前期的 share 天然就比后期的 share 值钱(因为每一轮中,share 越多,那 share 的价值就越被稀释,而实际每个 share 的成本是一样的)。slush 法的打分补偿了这个不均衡的过程(分数指数增长,反过来就是前面 share 的分数指数衰减)。其中 \(c\) 是常数,用来控制分数的增长速度,\(c\) 越小,分数增长越快,矿工收益的方差越大,受 pool-hopping 的影响越小。
缺点:
-
按分数之和而不是 share 个数平分,仍然会收到基于矿池算力波动的 pool-hopping 影响(就是基于矿池的算力是否波动,来决定是不是切走算力)
-
计算分数时没有考虑难度,会有基于预期难度调整的 hopping
-
最重要的是,随着时间增长,老 share 的分数会来对于新 share 的分数指数衰减,逐渐稳定,但时间较短的那轮的每个 share 仍然更值钱,时间越长的轮 share 仍越不值钱。也就是没有从根本上解决 pool-hopping
几何法
几何法是受 Slush 法启发发明的方法。创新点在于矿池收 2 种手续费,一个固定的,一个可变的。
算法步骤:
-
选定 \(f\) 和 \(c\)。\(f\) 为固定的手续费率,\(c\) 为可变费率
-
在每轮的开始,令 \(s=1\),对于矿工 \(k\),令他在这轮的分数 \(S_k = 0\)
-
令 \(r=1-p+\dfrac{p}{c}\),\(p=\dfrac{1}{D}\),难度调整时,\(r\) 会改变
-
当矿工 \(k\) 提交 share 时,\(S_k += spB\) ,\(s *= r\)
-
当 share 可以作为块上链时,一轮结束,矿工 \(k\) 获得 \(\dfrac{\lparen 1-f \rparen \lparen r-1 \rparen S_k}{sp}\)
矿池收费为 \(fB + c\lparen 1-f \rparen B\),剩下的 \(\lparen 1-c \rparen \lparen 1-f \rparen B\) 分给矿工。
因为每一个新 share 的分数是上一个的 \(r\) 倍,这会导致 \(s\) 成指数增长,老 share 的分数成指数衰减。这一轮第 \(I\) 个 share 的分数为 \(r^{I-1}pB\), \(c\) 越大,衰减越慢。
假如 \(p\)、\(B\) 固定,一轮最终有 \(N\) 个 share,则 \(s=r^N\),矿工 \(k\) 的收益可进行如下变形:
注意最后两个等式,这相当于这一轮总的分数是 \(\sum_{i=-\infin}^{N} \lparen r^{i-1} pB \rparen\),在所有矿工提交之前,矿池自己有了一个分数 \(\sum_{i=-\infin}^{0} \lparen r^{i-1} pB \rparen = \dfrac{pB}{r-1}\),所有矿工总的分数是 \(\sum_{i=1}^{N} \lparen r^{i-1} pB \rparen\)。
基于这种方法,矿工每个 share 的收益期望为 \(\lparen 1-c \rparen \lparen 1-f \rparen pB\),方差近似为 \(\dfrac{{\lparen pB \rparen}^2}{2c+p}\)(这是 \(c \isin \lparen 0,1 \rparen\) 时计算得到的方差),这是单独挖矿时的 \(\dfrac{1}{2cD+1}\) 倍。矿池每个块手续费的期望为 \(\lparen c+f-cf \rparen pB\)。如果 \(c \rarr 0\) ,相当于只有出块的 share 获得奖励(因为此时 \(r \rarr \infin \) ,每个新 share 分数指数增加,相对于最后那个出块的 share 得分 \({\infin}^{N-1}pB\),前面的所有 share 的分数之和相对都微乎其微了),方差也就和单独挖矿时一样了。
如果 \(c+f-cf\) 不变,\(c\) 增大 \(f\) 减小,则矿池方差变大,矿工方差减小,这时只要 \(f\) 为正,矿池就不会亏损。如果 \(c\) 继续增大,导致 \(f\) 为负,就相当于矿池补贴矿工。如果 \(c \rarr 1\),\(f \rarr -\infin \),则相当于 PPS 方法。
在实现上,\(s\) 指数增大可能会导致数值溢出,有 2 种方法可以解决:
-
定期缩小分数。令 \(S_k /= s\),再令 \(s=1\)
-
用指数运算
-
选定 \(f\) 和 \(c\),\(f\) 为固定的手续费率,\(c\) 为可变费率
-
在每轮的开始,令 \(s=0\),对于矿工 \(k\),令他在这轮的分数 \(S_k = -\infin\) 或者一个非常小的负数。
-
令 \(r=\ln{\lparen 1-p+\dfrac{p}{c} \rparen }\),\(p=\dfrac{1}{D}\),难度调整时,\(r\) 会改变
-
当矿工 \(k\) 提交 share 时,\(S_k = s + \ln{\lparen e^{\lparen S_k - s \rparen } + pB \rparen }\) ,\(s += r\)
-
出块则支付 \(\dfrac{\lparen 1-f \rparen \lparen e^{r}-1 \rparen e^{S_k - s}}{p}\)
-