BTC-挖矿
回顾两种节点类型
全节点
- 一直在线
- 在本地硬盘上维护完整的区块链信息
- 在内存里维护 \(\text{UTXO}\) 集合,以便快速检验交易的正确性
- 监听比特币网络上的交易信息,验证每个交易的合法性
- 决定哪些交易会被打包到区块里
- 监听别的矿工挖出来的区块,验证其合法性
- 挖矿
- 决定沿着哪条链挖下去? -> 最长合法链
- 当出现等长的分叉的时候,选择哪一个分叉? -> 最先听到的
轻节点
- 不是一直在线
- 不用保存整个区块链,只要保存每个区块的块头
- 不用保存全部交易,只保存与自己相关的交易
- 无法检验大多数交易的合法性,只能检验与自己相关的那些交易的合法性
- 无法检测网上发布的区块的正确性
- 可以验证挖矿的难度
- 只能检测哪个是最长链,不知道哪个是最长合法链
挖矿设备
- 早期使用通用计算机的 \(\text{CPU}\),挖矿计算哈希值仅用到通用 \(\text{CPU}\) 中的部分指令,计算机的内存等大部分也是闲置的
- 之后使用 \(\text{GPU}\),\(\text{GPU}\) 并行计算的能力是闲置的,浮点计算的能力也用不上
- 现使用 \(\text{ASIC}\)
Application Specific Integrated Circuit
芯片,专为挖矿设计的芯片
通用 -> 专用
矿池
单个矿工像是买彩票,挖中概率很低,挖中奖励很大,收入并不稳定。对于整个网络而言是 \(10\) 分钟一个区块,而对一个矿工而言可能数年才挖出一个区块,而在出块前的成本是没有回报的。并且矿工还需要承担全节点的其他功能
因此出现了 mining pool
矿池,一个矿池具有一个 pool manager
矿主,下面拥有很多 miner
矿工
在矿池中,矿主只需要负责计算哈希值,而全节点的其他功能由 pool manager
完成,同时矿工使用的 ASIC
芯片也无法完成全节点的功能
当一个矿池挖出区块时,由矿池中的矿工分红。这里仍然需要用到工作量证明:
例如当前比特币网络要求的 nonce
为前 \(50\) 位为 \(0\),而在矿池中的矿工挖到了 nonce
前 \(40\) 位为 \(0\) 的 almost valid block
,矿工可以将此块(称为 share
)提交给矿主用作工作量证明
当矿工挖到一个区块时,是否可以不告知矿主而自己偷偷发布以获取出块奖励?
并不能,矿工的任务是由矿主发布的,矿工仅负责尝试 nonce
,分配给矿工的块的出矿奖励地址是矿主的,矿工即使发布了也无法获得收益