07挖矿难度
约 1067 个字 预计阅读时间 4 分钟
Q: BTC系统中如何调整挖矿的难度
- 不断找nonce,使得\(H(\mbox{block header}) \leq \mbox{target}\)
- BTC期望出块时间稳定在10min
比特币每2016个区块,会做一次难度调整,约14天
- 新target = 当前target * 实际2016个区块出块时间 / 理论2016个区块出块时间(2周)
挖矿
全节点:
- 一直在线 & 在本地硬盘上维护完整区块链信息
- 在内存中维护UTXO集合,以便于快速检验交易合法性
- 监听比特币网络中交易内容,验证每个交易合法性
- 决定哪些交易会打包到区块中
- 监听其他矿工挖出的区块,验证其合法性
- 挖矿:
- 决定沿着哪条链挖下去 → 最长合法链
- 当出现等长分叉,选择哪一个分叉 → 最先被监听到的
轻节点:
- 不是一直在线; 不用保存整个区块链,只保存每个区块的块头
- 不用保存全部交易,只保存与自己相关的交易
- 无法检验大多数交易的合法性,只能检验与自己相关的那些交易的合法性
- 无法检测网上发布的区块的正确性
- 可以验证挖矿的难度
- 只能检测哪个是最长链,不知道哪个是最长合法链
比特币系统如何安全性?
- 密码学的保证:别人没有自己的私钥,则无法伪造其合法签名,故无法将其账户上BTC转走(前提:系统中大多数算力掌握在好人手中)
- 共识机制:保证了恶意交易不被系统承认
挖矿设备
普通CPU → GPU → ASIC芯片Application-Specific Integrated Circuit(挖矿专用矿机)
- ASIC芯片并不是普通人可以参与的,大大提升了挖矿的门槛(普通人别想了...)
矿池
对于单个矿工来说,即使用了ASIC,其算力在整个系统中仍只占据很少一部分,收入很不稳定。还要承担全节点其他责任,造成了算力的消耗
- 矿池的出现(把矿工组织起来,作为一个整体)
- 矿工只需要不停计算哈希值,而全节点其他职责由矿主(pool manager)来承担
矿池一般具有两种组织形式:
- 类似大型数据中心(同一机构),集中成千上万矿机进行哈希计算
- 分布式: 矿工与矿主不认识(不同机构),矿工与矿主联系,自愿加入其矿池,矿主分配任务,矿工进行计算,获得收益后整个矿池中所有矿工进行利益分配
若矿工来自非同一机构(五湖四海),收益如何分配?
- Idea1:平均分配,所有人平分出块奖励(按照工作量大小,如何衡量工作量?)
- Idea2:降低挖矿难度(可行方案)
- 假设挖矿难度需126位的hash前70位=0,现在只需前60位=0,这样会更容易挖到
- 但这个哈希是不会被区块链所承认的,将其称为一个share(almost valid share)
- 矿工每挖到一个share,将其提交给矿主,矿主对其进行记录,作为矿工工作量的证明
- 等到某个矿工真正挖到符合要求的的区块后,根据所有矿工提交的share数量进行分配
为何可行?: 因每个矿工尝试的nonce越多,挖到矿的可能性越大,所能得到的share也会越多,故可作为工作量的衡量
若51%算力矿池可以发动哪些攻击?
- forking attack(分叉攻击)
- Boycott封锁交易: 假如攻击者不喜欢账户A,不想让A的交易上区块链,在监听到有其他人将A的交易发布到区块链上时,立刻发动分叉攻击,使A所在链无法成为"最长合法链"。便实现了对A账户的封锁
矿池出现的优劣:
- 优点:解决了矿工收入不稳定的问题,减轻了矿工的负担
- 缺点:威胁到了区块链系统的安全,使得51%攻击变得容易