比特币矿池挖矿的奖励系统分析(零)

9 minute read Published: 2019-10-20

来自论文:Analysis of Bitcoin Pooled Mining Reward Systems

矿池奖励系统的根本论文,目前的矿池基本上都是遵循这篇 2011 年的论文里面描述的方法。从数学概率上说明矿池存在的意义就是降低矿工收益的方差。由于论文较长,记得笔记包含很多数学公式,所以会分为几篇来发。要注意里面提到的期望和方差分别属于什么随机变量

绪论

难度

在介绍论文的内容之前,首先要引入一点关于比特币的难度、target 等前置知识。

比特币区块的 header 里面有一个 bits 字段来存储 target,但它存的并不直接存的整数,而是用 4 字节来压缩存储一个较大的整数。header 是按小端序存储的,也就是对于 0x12345678,最高字节(位于最大的地址位置)是 0x12,记为 a;低 3 字节是 0x345678,记为 b,那么 target 这个整数的计算公式为 \(b * 2^{\lparen 8 * \lparen a-3 \rparen \rparen}\)。由于 bits 字节数的有限性和所采取的这种压缩方案,整数往 bits 格式转的时候会发生精度丢失,也就是多个整数会转到同一个 bits。

整数转为 bits 格式的步骤:

32 字节最大的无符号整数 \(2^{256} - 1\) 按照上面的步骤转化,得到 bits 为 0x1d00ffffff。而将这个 bits 转为 target 得到的却是 \(\text{0xffff} * 256^{\lparen \text{0x1d} - 3 \rparen} = \text{0xffff} * 2^{208} \)。这个 target 就是按这种压缩方案能得到的最大 target。而 target 越大,说明出块越容易,因此引入 难度 的概念,将之定义为 target 的倒数,即 \(\text{diff} = \dfrac{ \text{targetmax} }{ \text{target} }\)。这样 target 为 \(\text{0xffff} * 256^{\lparen \text{0x1d} - 3 \rparen}\) 时,难度为 1,也就是最低难度,这也是比特币创世区块的难度。

假设出块难度为 D,那么 target 为 \(\dfrac{\text{0xffff} * 2 ^ {208}}{D}\),那么每一次哈希是块的概率为 \(\dfrac{\text{target}}{2^{256}} = \dfrac{2^{16} - 1}{2^{48} * D}\)。这也同样能估算出全网算力: \(\dfrac{ \dfrac{2^{48}D}{2^{16}-1} }{ \text{blocktime} }\)。

挖矿的收益期望与方差

下面开始论文的内容。

假设每个块的奖励为 \(B\),发现块的难度为 \(D\),那么目标值就是让每次哈希是合法块的概率,为 \(\dfrac{2^{16}-1}{2^{48} * D} \approx \dfrac{1}{2^{32}D} \),假设 \(D\) 为 1,那每次哈希是块的概率是 \( \dfrac{1}{2^{32}}\)。矿工的算力哈希率为 \(h\),那么在 \(t\) 时间内,收益的期望是 \(\dfrac{htB}{2^{32}D} \)。

以固定算力 \(h\) 单独挖矿,发现块是一个泊松过程,参数为 \(\dfrac{h}{2^{32}D}\),\(t\) 时间平均能挖 \(\dfrac{ht}{2^{32}D}\) 个块。所以找到块的数目服从 \( \lambda = \dfrac{ht}{2^{32}D}\) 的泊松分布,因此找到块的数目和方差都是 \( \lambda \)。收益的方差为 \(\lambda B^2\),相对标准差为 \(\dfrac{\sqrt{\lambda B^2}}{\lambda B} = \dfrac{1}{\sqrt{\lambda}}\),每天都有收益的概率是 \(1-e^{-\lambda}\)。可见单独挖矿的几乎不可能每天都能有收益。

假设矿池的总算力为 \(H\),某个人占矿池算力的比例为 q,\(h=qH\),他的收益期望 \(q\dfrac{HtB}{2^{32}D}=\dfrac{htB}{2^{32}D} \) 仍和单独挖矿时一样,但是方差会小得多,\(\dfrac{HtB^2}{2^{32}D}q^2=q\dfrac{htB^2}{2^{32}D} \),为原来的 \(q\) 倍。

在这篇论文里面,假设 share 的难度定为 1,那么每个 share 是合法块的概率是 \(p=\dfrac{1}{D}\)。如果哈希函数的信息熵是均匀的话,那么寻找 share 和寻找合法块的过程是无法偏离的,平均从概率上来看,找到 share 的数目和执行哈希的次数是比例的。因此矿工对每个 share 的期望收益是 \(pB\)。

如何把奖励公平地分给矿工?这不是一个简单的问题。

简单的奖励系统

按比例分

具体方法是:矿池提交到链上的两个块之间的时间为一轮。按矿工提交 share 的比例平均分这个块的奖励,为 \(\dfrac{n}{N}\lparen 1-f \rparen B\),\(f\) 为矿池手续费比例。

这个算法中每个 share 的收益期望是 \(\lparen 1-f \rparen pB\),方差是 \(p^2B^2\ln{D}\),如果单独挖矿,每个 share 的方差是 \(pB^2\),所以方差改善了 \(\dfrac{\ln{D}}{D}\) 倍。

但是这些的前提是矿工不变动,假如矿工在每个 share 的期望收益小于 \(\lparen 1-f \rparen pB\) 时切走算力,那就会让仍保留的矿工收益低于理论值(最多可少 43%)。这就是 pool-hopping 策略。每个 share 的实际收益是 \(\dfrac{B}{N}\),\(N\) 越大,这一轮的时间就越长, share 的收益就越小。

比例分的方法只适合这种项目:过去工作量总是有助于完成目标,缩小完成时间。但挖矿是完全随机的,不满足这个条件。实际每一轮的 share 个数服从概率为 \(p\),平均值为 \(D\) 的几何分布,它是无记忆的。

PPS(pay-per-share)

矿工每提交一个 share,就得到 \(\lparen 1-f \rparen pB\) 的收益。不管实际有没有挖到块,反正所有块的收益都属于矿池。

这种方式对矿工的好处:

但是这时候方差的风险完全由矿池承担了,它的方差和单独挖矿的矿工一样,并且算力越大,方差越大

为了弥补矿池的方差风险,PPS 一般会定一个比其它方案高的手续费。

PPS 矿池必须要有资金储备,否则很有可能会破产。使破产概率小于 \(\delta\),最低储备 \(R=\dfrac{B\ln{\dfrac{1}{\delta}}}{2f}\),这比想象中大得多。