区块链基础
比特币挖矿与工作量证明
矿工如何构建区块,节点如何验证区块,以及如何审查挖矿投资项目。
人物与项目
比特币矿工具体做什么
比特币挖矿包括选择交易和寻找符合条件的区块头。矿工先构建候选区块,用 Merkle 根对其中的交易作出承诺,再不断调整允许修改的字段,对区块头进行哈希计算。结果必须满足网络当前的目标值。更高的算力意味着每秒可以尝试更多次,而不是能够预先指定成功的哈希结果。
候选区块通常包含支付手续费的交易,以及一笔领取允许的区块补贴和手续费的特殊 coinbase 交易。矿池可以把工作分配给参与者,并通过难度较低的工作证明,也就是 share,记录各人的贡献。矿池接受一份 share,表示它符合该矿池的工作计量规则。绝大多数 share 并不是有效的比特币区块,因此面板中显示大量 share,并不表示该用户独立找到了同样数量的区块。 Bitcoin developer guide: mining.
- 组装交易、Merkle 根和候选区块头
- 寻找工作量证明调整区块头,直到哈希满足目标值
- 验证全节点检查区块及其中的每笔交易
即使工作量证明符合目标,节点仍会拒绝违反验证规则的区块。
工作量证明不等于区块有效
全节点按照共识规则检查区块及其交易。例如,花费条件必须得到满足,普通交易输出的总价值不能高于输入的总价值。coinbase 交易领取的奖励也不能超过允许的金额。对于遵守规则的节点,一个违反规则的区块不会因为消耗了大量算力就变得有效。
理解这一点,有助于判断“矿工可以拿走任何人的币”这类说法。算力不会直接暴露其他用户的私钥。重新排列有效交易、在竞争历史中替换攻击者自己的付款,以及伪造他人的签名,是不同的能力。把这些行为混为一谈,会同时误解攻击方式和防护边界。 Bitcoin developer guide: transactions.
如何选择竞争中的链
在一个区块传播到所有参与者之前,其他矿工可能已经找到竞争区块。节点因此需要在多条有效历史之间作出选择。比特币依据累计工作量选择链,而不是让每个宣称在线的节点各投一票。替代历史既要符合验证规则,也要在工作量上形成竞争。创建大量网络身份并不能代替挖矿算力。
比特币每经过 2,016 个区块,会依据上一调整周期的耗时调整目标值。它追求的平均出块间隔约为 10 分钟。这是统计平均值,不是固定时刻表。某些区块很快出现,另一些则可能需要更长时间。浏览器暂时没有显示新区块,单凭这一点不能证明网络已经停止运行。 Bitcoin developer guide: the blockchain.
确认次数能降低什么风险
付款被纳入接受链上的一个区块时,会得到首次确认。之后的区块继续延长这段历史。若要用竞争历史替换较早的付款,就需要与更多累计工作量竞争。比特币白皮书分析了攻击者试图追赶诚实链的情况,并解释攻击者算力占比和付款深度为什么重要。
确认不会检查商家是否交货、交易所是否有能力偿还客户,也不会判断打着比特币投资旗号的代币是否诚实。例如,交易所可以把一笔真实且已确认的存款计入客户账户,然后把资产借给关联公司。链上记录仍然可能完全正确,而托管方的偿还能力已经恶化。 Bitcoin whitepaper, sections 5 and 11.
如何审查挖矿投资承诺
审查挖矿项目时,首先明确卖的是什么:一台机器、机器产出的合同份额、运营商账户里的余额,还是所谓由挖矿支撑的代币。矿池向公司付款,首先只能证明公司收到了这笔款项。它既不能证明某位客户拥有一台机器,也不能证明该客户对这笔收入享有权利。
假设某运营商展示矿池面板,并承诺固定的每日回报。面板数据需要与其宣称的设备、运营期间和付款记录相互对应。对于固定回报,还必须解释成本或产量变化时由谁弥补不足。设备照片无法回答这个合同问题。没有得到解释的差异应保持为未解决的问题,而不能直接变成推荐理由或没有证据的诈骗指控。
把原始报价、付款地址、合同条款和注明日期的截图放在一起保存。对照运营商宣传的产量与实际提供的记录,并区分总收入和扣除成本及义务后剩余的金额。这里审查的是一项业务及其承诺。比特币区块验证本身不能回答这些问题。